python正则模块re
一.re模块内置的函数方法
re.compile(pattern, flags=0)
https://cdn.analyticsvidhya.com/wp-content/uploads/2019/06/seq2seq.gif)
re.compile()方法可以把一个正则表达式编译成一个正则对象(PatternObj),返回的正则对象是操作其他处理字符串方法的主体。
pattern_obj = re.compile(pattern)
match_obj = pattern_obj.compile(string)
等同于:
match_obj = re.match(pattern,string)
实际上re.match()处理流程内含re.compile()的过程。match方法源码:
def match(pattern, string, flags=0):
"""Try to apply the pattern at the start of the string, returning
a Match object, or None if no match was found."""
return _compile(pattern, flags).match(string)
可以看出match方法返回的实际就是正则对象pattern_obj调用match()方法的结果。
re.search(pattern, string, flags=0)
re.search()方法是搜索整个字符串,找到第一个符合正则规则的字符串部分,返回一个匹配对象(MatchObject);没有匹配成功,就返回None。
a= 'ababb_ijfknb'
b=re.search(r'((a|b)+)((\w)+)',a)
b.group(0)
#Out[22]: 'ababb_ijfknb'
b.group(1)
#Out[23]: 'ababb'
b.group(2)
#Out[24]: 'b'
b.group(3)
#Out[25]: '_ijfknb'
关于re.search当进行分组时,group(0) 就是整个匹配的内容,小括号代表分组,上述代码:group(1)是第一组即第一个小括号里面匹配的内容,当小括号里面嵌套了括号,会将最后在string匹配的内容作为一个组,然后是最后一个组。
re.match(pattern, string, flags=0)
re.match()方法是从字符串开始位置匹配整个字符串,当从字符串开始成功匹配到部分字符内容,返回一个匹配对象(MatchObject);没有匹配成功,就返回None。
re.search()和re.match()区别对比:位置上,search()方法可以从字符串任意位置匹配部分字符串内容 match()方法必须从字符串开始位置匹配字符串内容,一旦开头匹配不成,则匹配失败;内容上,search()方法是非贪婪匹配,只要找到第一个符合正则规则的部分字符串就返回匹配对象,match()方法则是按照正则规则只匹配字符串开始位置的部分字符串;多行模式下,match()方法依旧只会匹配字符串的开始位置,而search()方法和“^”联合使用则是从多行的每一行开始匹配。
re.split(pattern, string, maxsplit=0, flags=0)
re.split()表示对字符串string,按照正则表达式pattern匹配内容分隔字符串,其中maxsplit是指最大分隔次数,最大分隔次数应该是小于默认分隔次数的。分隔后的字符串内容组成列表返回。 如果在 pattern 中捕获到括号,那么所有的组里的文字也会包含在列表里。
import re
split_list_default = re.split(r'\W+', 'Words, words, words.')
print(split_list_default)
# ['Words', 'words', 'words', ''] 正则表达式\W+表示以一个或多个非单词字符对字符串分隔,分隔后组成列
#表的形式返回,注意列表后空字符串为'.'和之前的words分隔结果
split_list_max = re.split(r'\W+', 'Words, words, words.', 1)
print(split_list_max)
# ['Words', 'words, words.'] 指定分隔次数,字符串分隔会由左至右按照maxsplit最大分隔次数分隔,实际最大分隔次数是小于等于默认分隔次数的
split_list_couple = re.split(r'(\W+)', 'Words, words, words.')
print(split_list_couple)
# ['Words', ', ', 'words', ', ', 'words', '.', '']
#正则表达式中存在分组情况,即捕获型括号,(\W+)会捕获字符串中‘, ’并添加至列表一起显示出来
split_list_couple = re.split(r'(?:\W+)', 'Words, words, words.')
#?:开头将分隔符不显示
print(split_list_couple)
#['Words', 'words', 'words', '']
带分组的split方法
b = 'a12ass12asa123'
re.split(r'(1|2)',b)
#Out[7]: ['a', '1', '', '2', 'ass', '1', '', '2', 'asa', '1', '', '2', '3']
#同时出现1和2时,12中间的‘’当做占位 被显示出来
re.split(r'((1|2))',b)
Out[8]:
['a','1','1', '','2', '2','ass','1', '1', '','2', '2', 'asa','1', '1','','2', '2','3']
#这里讲分隔符号显示了两次 ,两组括号
b = 'a1fyu2342ajbui8542ss12asa123'
re.split(r'(?:1|2)',b)
#Out[54]: ['a', 'fyu', '34', 'ajbui854', 'ss', '', 'asa', '', '3']
re.findall(pattern, string, flags=0)
re.findall()类似于re.search()方法,re.search()是在字符串中搜索到第一个与正则表达式匹配的字符串内容就返回一个匹配对象MatchObject,而re.findall()方法是在字符串中搜索并找到所有与正则表达式匹配的字符串内容,组成一个列表返回,列表中元素顺序是按照正则表达式在字符串中由左至右匹配的返回;未匹配成功,返回一个空列表。
import re
pattern = r'\d{3}'
find = re.findall(pattern, 'include21321exclude13243alert213lib32')
print(find)
#注意:findall是将匹配的内容得到,以匹配后数值index+1位置继续进行寻找
# ['213', '132', '213']
#所以,本次并没有对于21321得到213,132,321序列,而是213,然后从3后面的2出发继续寻找,得到132和213
注意
: 当re.findall()中的正则表达式存在两个或两个以上分组时,按照分组自左向右的形式匹配,匹配结果按照顺序组成元组,返回列表中元素以元组的形式给出。a = 'Frank Burger: 925.541.7625 662 South Dogwood Way,Ronald Heathmore: 892.345.3428436 Finley Avenue' re.findall(r'[a-z]+ [a-z]+: (\d{3}\.\d{3}\.\d{4})',a,re.I) #返回分组之后内容 #Out[70]: ['925.541.7625', '892.345.3428']
import re
pattern = r'(\d{3})(1)'
find = re.findall(pattern, 'include21321exclude13243alert213lib32')
print(find)
re.finditer(pattern, string, flags=0)
re.finditer()相似于re.findall()方法,搜索字符串中所有与正则表达式匹配的字符串内容, 返回一个迭代器Iterator ,迭代器Iterator内保存了所有匹配字符串内容生成的匹配对象MatchObject。即匹配文本封装在匹配对象MatchObject中,多个匹配对象MatchObject保存在一个迭代器Iterator中。
import re
pattern = r'\d{3}'
find = re.finditer(pattern, 'include21321exclude13243alert213lib32')
print(find)
for i in find:
print(i)
print(i.group(0