2021/1/13 re模块(正则表达式)
re模块(正则表达式)
正则表达式匹配符

字符类

特殊字符类

findall方法及实例
import re # 正则表达式 # findall返回全部 # 元字符匹配 # . ? * + {m, n} .* .*? # . 匹配任意字符 # 如果匹配成功光标则移到匹配成功的最后一个位置 # 如果匹配未成功光标则移到下一个字符重新开始匹配 print(re.findall('a.b', 'ab a)b a1b a牛b aaaaan abbb')) #结果['a)b', 'a1b', 'a牛b', 'abb'] # ?匹配0个或1个由左边字符定义的片段 print(re.findall('a?b', 'ab aab')) print(re.findall('a?b', 'sb ab aab')) # * 匹配0个或多个左边的字符表达式.满足贪婪匹配 print(re.findall('a*b', 'aaab ab b')) #['aaab', 'ab', 'b'] # + 匹配1个或者多个左边字符表达式.满足贪婪匹配 print(re.findall('a+b', 'aaab ab b')) #['aaab', 'ab'] # {m,n} 匹配m个至n个左边字符表达式.满足贪婪匹配 print(re.findall('a{1,5}b', 'ab aab aaab aaaab aaaaaaab')) # .*贪婪匹配 (匹配头到尾) print(re.findall('a.*b', 'aab abb aaab abbb aa#b')) #['aab abb aaab abbb aa#b'] print(re.findall('a.*b', 'aab abb aaab abbb aa#b'), re.DOTALL) #换行符也匹配 # .*? 此时的?不是对左边的字符进行0次或者1次的匹配 # 而只是针对.*这种贪婪匹配的模式进行一种限定:告知他要遵从非贪婪匹配,推荐使用 print(re.findall('a.*?b', 'aab abb aaab abbb aa#b')) #['aab', 'ab', 'aaab', 'ab', 'aa#b'] # 贪婪匹配,只要满足都全匹配 # 非贪婪匹配,只要满足就先把匹配的取出,对剩下的字符进行再次匹配 # []:括号中可以放任意一个字符,一个中括号代表一个字符 # - 在[]中表示范围,如果想要匹配上- 那么这个-符号不能放在中间 # ^在[]中表示取反 print(re.findall('a[abc]b', 'aab abb acb adb afb a_b')) print(re.findall('a[0-9]b', 'aab abb acb adb afb a_b')) print(re.findall('a[A-Z]b', 'aab abb acb adb afb a_b')) print(re.findall('a[a-z]b', 'aab abb acb adb afb a_b')) print(re.findall('a[a-zA-Z]b', 'aab abb acb aBb afb a_b')) # 当需要匹配 - 时,要把他放在[]里面的最前面 print(re.findall('a[-*$]b', 'a-b')) print(re.findall('a[^0-9]b', 'a1b a%b a*b'))
小练习
import re s = "alex_sb wusir_sb ritian_sb ping_nb yuanbao_sb dab_sb" print(re.findall('\w+_sb', s)) #['alex_sb', 'wusir_sb', 'ritian_sb', 'yuanbao_sb', 'dab_sb'] # #()对匹配规则分组 print(re.findall('(\w+)_sb', s)) #['alex', 'wusir', 'ritian', 'yuanbao', 'dab'] #|匹配左边和右边 print(re.findall('ping|sen|pu', 'pingsenpu返回点卡收费合理卡的发挥浮动空间和付款的话dfdsfdpingsfadfadfafad')) #['ping', 'sen', 'pu', 'ping'] print(re.findall('companies|company', 'Too many companies have gone bankrupt, and the next one is my company')) print(re.findall('compan(ies|y)', 'Too many companies have gone bankrupt, and the next one is my company')) # ()分组里面加?: 将全部的内容给我返回回来,而不是将组内的内容返回 print(re.findall('compan(?:ies|y)', 'Too many companies have gone bankrupt, and the next one is my company'))
search方法
import re #search match #search 找到一个匹配然后返回一个包含匹配信息的对象 ret = re.search('sb|alex', 'alex sb sb barry ritian') print(ret.group())
match方法
import re #从字符串开头匹配,如果以符合条件的字符串开头则返回,否则返回None ret = re.match('ping', 'pingsdsadasdasfdsafdsfdsfasdfsd') print(ret.group())
split分割
import re s1 = '11,22 33~44;55' #依次按照分割的符号填入即可进行不规整分割 print(re.split('[, ~;]', s1))
sub方法
import re #sub()替换输出 将第三个位置参数内的第一位置参数字符替换成第二位置参数字符 print(re.sub('ping', 'senpu', 'ping有QQ号,ping也有微信号,但是ping更喜欢用微信'))
compile 指定一个匹配规则,返回一个对象
import re obj = re.compile('\d{2}') print(obj.search('fasfafdf12fdsf4564').group())
finditer 指定一个匹配规则,返回一个可迭代对象(迭代器)
import re ret = re.finditer('\d', '21321sadsadasd') print(ret) print(next(ret).group())

浙公网安备 33010602011771号