博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python3之正则表达式
阅读量:4520 次
发布时间:2019-06-08

本文共 2996 字,大约阅读时间需要 9 分钟。

1. 正则表达式

1.正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

2.正则不属于任何语言,大多数语言都提供了正则的支持;正则是一种模式的描述,有其特定的描述符
3.学习正则分两步:
1.了解正则的描述符(修饰符):
其中最主要的两个是
(1)re.I 使匹配对大小写不敏感;
(2)re.M 多行匹配,影响 ^ 和 $
2.掌握特定语言的方法或函数: re模块

python3使用正则表达式:

  • re.match()函数
    函数语法:re.match(pattern, string, flags=0)
    其中:
  • pattern指匹配的正则表达式
  • string指要匹配的字符串
  • flags指标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
    匹配成功re.match方法返回一个匹配的对象,否则返回None。
import re#re.match从开头匹配,匹配成功返回匹配对象,不成功返回Nonere1 = re.match(r'www', 'www.baidu.com', re.I)print(re1)  #<_sre.SRE_Match object; span=(0, 3), match='www'>匹配成功,返回的匹配对象print(re1.span())   #span表示调用的区间(从?开始到?结束)
  1. re.search()函数
    函数语法:re.search(pattern, string, flags=0)里边的参数同上
    re.search 扫描整个字符串并返回第一个成功的匹配。
    例1:
import re#re.search从整个字符串的任意位置开始re2 = re.search(r'com', 'www.baidu.com', re.I)print(re2)

例2:

re2 = re.findall(r'com', 'www.baidu.com,www.qq.com,www.360buy.cn,www.taobao.com', re.I)for e in re2:        print(e)   #输出的结果:  com com  comre3 = re.finditer(r'com', 'www.baidu.com,www.qq.com,www.360buy.cn,www.taobao.com', re.I)for i in re3:    print(i)#输出的结果:#<_sre.SRE_Match object; span=(10, 13), match='com'>#<_sre.SRE_Match object; span=(21, 24), match='com'>#<_sre.SRE_Match object; span=(50, 53), match='com'>

通过上述两个方法的对比,可以看出:虽然两个函数都可以求出匹配的个数,但是还是有根本的区别:re.findall()函数返回的是本身的个数;re.finditer()函数返回的是匹配的对象的个数

re.match与re.search的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

检索和替换

语法:re.sub(pattern, repl, string, count=0)
参数:

  • pattern : 正则中的模式字符串
  • repl : 替换的字符串,也可为一个函数
  • string : 要被查找替换的原始字符串
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配

    实例:

import rephone = "2004-959-559 # 这是一个电话号码"# 删除注释num = re.sub(r'#.*$', "", phone)print ("电话号码 : ", num)# 移除非数字的内容num = re.sub(r'\D', "", phone)print ("电话号码 : ", num)

输出的结果:

电话号码 :  2004-959-559 电话号码 :  2004959559

repl 参数是一个函数

以下实例中将字符串中的匹配的数字乘于 2:

import redef shuang(m):    v = int(m.group())   #group()默认的参数和sub()的参数一致    return str(v*2)print(re.sub(r'(\d+)', shuang, 'has 5 give 2 ,give he 1 ,sheng 1'))

输出的结果为:

has 10 give 4 ,give he 2 ,sheng 2

python利用正则表达式爬取数据:

实例:

#抓取数据:from urllib import requesturl = "http://www.kgc.cn/list/"for i in range(1, 3):    fname = '230-{0}-6-9-9-0.shtml'.format(i)    respone = request.urlopen(url+fname)    #print(respone.read().decode('utf-8'))    print('开始保存:{0}'.format(fname))    f = open(fname, 'w+', encoding="UTF-8")    f.writelines(respone.read().decode('utf-8'))    f.close()#爬取有用的数据:import refor i in range(1, 3):    fname = '230-{0}-6-9-9-0.shtml'.format(i)    f = open(fname, 'r', encoding='UTF-8')    f2 = open('data-{0}.txt'.format(i), 'w+', encoding='UTF-8')    print(f)    htmlStr = f.read()    p = r'(.+)'    p2 = r'(\d+)'    p3 = r'(.+)'    rs1 = re.findall(p, htmlStr, re.I | re.M)    rs2 = re.findall(p2, htmlStr, re.I | re.M)    rs3 = re.findall(p3, htmlStr, re.I | re.M)    for n in range(len(rs1)):        f2.write("{0} {1} {2}".format(rs1[n], rs2[n], rs3[n]))        f2.write('\n')    f2.close()    f.close()

简单的理解,有什么问题,希望大家提出宝贵的意见和建议……

转载于:https://www.cnblogs.com/cn-7876/p/7757775.html

你可能感兴趣的文章
网页图片加载失败,用默认图片替换
查看>>
C# 笔记
查看>>
android 之输入法
查看>>
编译参数-ObjC的说明
查看>>
配置Synergy(Server : XP, client: Win7)
查看>>
Hadoop集群(第7期)_Eclipse开发环境设置
查看>>
Mysql 多表查询详解
查看>>
Ubuntu下tensorboard的使用
查看>>
门面模式
查看>>
Navicat Premium 10/12——破解激活
查看>>
【leetcode❤python】 290. Word Pattern
查看>>
Mysql备份还原数据库之mysqldump实例及参数详细说明 -转自http://www.cnblogs.com/xuejie/archive/2013/01/11/2856911.html...
查看>>
2013年10月13日学习:SQL通过命令语句来创建表
查看>>
剑指offer : 二维数组中的查找
查看>>
第三章 python基础
查看>>
java基础题
查看>>
[转]人人店短信插件开发
查看>>
[转]c# System.IO.Ports SerialPort Class
查看>>
14. 最长公共前缀
查看>>
Redis文档
查看>>