接上文 Python编程--正则基础(一)https://developer.aliyun.com/article/1618836
4、finditer()函数
- 原型
def finditer(pattern, string, flags=0)
- 功能
与findall()类似,返回一个迭代器
- 参数
- 代码
import re
res = re.finditer('\w', '12hsakda1')
print(res)
print(next(res))
for i in res:
print(i)
5、split()函数
作用:切割字符串
原型:
def split(patter, string, maxsplit=0, flags=0)
参数
- pattern 正则表达式
- string 要拆分的字符串
- maxsplit 最大拆分次数 默认拆分全部
- flags 修正符
示例
import re
myStr = "asdas\rd&a\ts12d\n*a3sd@a_1sd"
#通过特殊字符 对其进行拆分 成列表
res = re.split("[^a-z]",myStr)
res = re.split("\W",myStr)
6、修正符
- 作用
对正则进行修正
使用
search/match/findall/finditer 等函数 flags参数的使用
- 修正符
re.I 不区分大小写匹配
re.S 使.可以匹配换行符 匹配任意字符
- 使用
re.I
print(re.findall('[a-z]','AaBb'))
print(re.findall('[a-z]','AaBb', flags=re.I))
re.S
print(re.findall('<b>.*?</b>','<b>b标签</b>'))
print(re.findall('<b>.*?</b>','<b>b标\n签</b>', flags=re.S))
四、正则高级
1、分组&起名称
- 概念
处理简单的判断是否匹配之外,正则表达式还有提取子串的功能,用()表示的就是要提取的分组
- 代码
#给当前匹配到的结果起别名
s = '3G4HFD567'
re.match("(?P<value>\d+)",s)
print(x.group(0))
print(x.group('value'))
- 说明
正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来
group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串
2、编译
- 概念
当在python中使用正则表达式时,re模块会做两件事,一件是编译正则表达式,如果表达式的字符串本身不合法,会报错。另一件是用编译好的正则表达式提取匹配字符串
- 编译优点
如果一个正则表达式要使用几千遍,每一次都会编译,出于效率的考虑进行正则表达式的编译,就不需要每次都编译了,节省了编译的时间,从而提升效率
compile()函数
- 原型
def compile(pattern, flags=0)
作用
将pattern模式编译成正则对象
参数
import re
re_phone = re.compile(r"(0\d{2,3}-\d{7,8})")
print(re_phone, type(re_phone))
编译后其他方法的使用
原型
def match(self, string, pos=0, endpos=-1)
def search(self, string, pos=0, endpos=-1)
def findall(self, string, pos=0, endpos=-1)
def finditer(self, string, pos=0, endpos=-1)
参数
示例
s1 = "lucky's phone is 010-88888888"
s2 = "kaige's phone is 010-99999999"
ret1 = re_phone.search(s1)
print(ret1, ret1.group(1))
ret2 = re_phone.search(s2)
print(ret2, ret2.group(1))
3、贪婪与非贪婪
- 贪婪模式
贪婪概念:匹配尽可能多的字符
.+ 匹配换行符以外的字符至少一次
.* 匹配换行符以外的字符任意次
- 实例
res = re.search('<b>.+</b>', '<b></b><b>b标签</b>')
res = re.search('<b>.*</b>', '<b>b标签</b><b>b标签</b><b>b标签</b><b>b标签</b>')
- 非贪婪模式
非贪婪概念:尽可能少的匹配称为非贪婪匹配,?、+?即可
.+? 匹配换行符以外的字符至少一次 拒绝贪婪
.? 匹配换行符以外的字符任意次 拒绝贪婪
实例
res = re.search('<b>.+?</b>', '<b>b标签</b><b>b标签</b>')
res = re.search('<b>.*?</b>', '<b>b标签</b><b>b标签</b><b>b标签</b><b>b标签</b>')
lucky ↩︎