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())

 

posted @ 2021-01-13 17:32  ping_sen  阅读(79)  评论(0)    收藏  举报