正则 深入学习

例1–search() 的匹配(分组重命名)

import re
mystr=r'wee123/lily'
#?P<value>的意思就是命名一个名字为value的组,匹配规则符合后面的\d{3}
#?p<id>\d{3}的意思是命名一个名字为id的组,匹配规则符合d{3}
ret=re.search('(?P<id>\d{3})/(?P<name>\w{4})',mystr)
print(ret.group())
print(ret.group('id'))
print(ret.group('name'))

例2–匹配所有(贪婪)

import re
mystr=r'wee123/lily'
pattern='wee.*'  # pattern='wee.+' is also OK
ret=re.search(pattern,mystr).group()
print(ret)
#wee123/lily

例3–只匹配一个(不贪婪)

import re
mystr=r'wee123/lily'
pattern='wee12.+?'  # OR .?
ret=re.search(pattern,mystr).group()
print(ret)
#wee123

例4–Python正则表达式多次重复错误

p2=r'(\w)+'  # + 默认匹配前面的字符无限次,如果把括号去掉,则匹配http
print(re.findall(p2,'http'))
p2=r'.?+'  # + 默认匹配前面的字符无限次,如果把括号去掉,则匹配http
print(re.findall(p2,'http'))  # re.error: multiple repeat at position 2,因为量词重叠导致的错误

#re.error: multiple repeat at position 2,
(.?*)(\d+)  问题出在正则的写法存在问题,因此去掉?或者*均可  
(.*)(\d+)

例5-- ^ 解释为 要匹配的字符 必须从string[0]开始就符合^后面的字符,即使有多行,也不能重新匹配,必须得是第一行的前几个字符

import re
content = """ahello 1234567 World_This is a Regex Demo
Hello 1267 World_This is a Regex Demo"""
result = re.findall('^He.*?(\d+).*Demo$',content,re.S)
print(result)
##
[]

例 6 特殊字符

#wave_1
# pattern为空格,逗号和任意字符pattern=' |,|.' 三者是或关系,无法完全匹配整体‘ ,a’

#wave_2
# 匹配空格逗号和点,没有中间的|也可以,其中点代表要匹配点. ,而不是任意字符,即特殊字符. 失去了代表任意字符的超能力
pattern='[ |,|.]'  

import re
mystr='love never,felt so good'
pattern=' |,|.'  # 匹配空格逗号和点,没有中间的|也可以,其中点代表要匹配点. ,而不是任意字符
temp=re.findall(pattern,mystr)  #[' ', ' ', ' ', ' ']
print(len(temp))# 23
print(temp)
silly=re.split(pattern,mystr)
print(len(silly))  # 为啥会多出一个空字符串?????# 24
print(silly)
# print(re.findall('a?', 'aaaa'))

23
['l', 'o', 'v', 'e', ' ', 'n', 'e', 'v', 'e', 'r', ',', 'f', 'e', 'l', 't', ' ', 's', 'o', ' ', 'g', 'o', 'o', 'd']
24
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']

例7 – re.splt/str.split
python字符串切割:str.split()和re.split()对比

# str.split不支持正则及多个切割符号,不感知空格的数量,比如用空格切割,会出现下面情况。
>>> s1="aa bb  cc"  # bb和cc中间两个空格
>>> s1.split(' ')  # 一个空格
['aa', 'bb', '', 'cc']

s=' from   the ashes   a fire shall  be woken '  # 首尾n个空白 分割后仍有n个空格,其他位置都是n-1 个空格
print(s.split(' '))
# ['', 'from', '', '', 'the', 'ashes', '', '', 'a', 'fire', 'shall', '', 'be', 'woken','']

' '.split(' ')    # ['', ''],只有空白字符时分割成两个空格
'a1aa2aa3'.split('a')
#['', '1', '', '2', '', '3']


re
使用括号捕获分组的适合,默认保留分割符
re.split('([;])',line)
['abc aa', ';', "bb,cc | dd(xx).xxx 12.12'\txxxx"]
去掉分隔符,加?:
>>> re.split(r'(?:;)',line)
['abc aa', "bb,cc | dd(xx).xxx 12.12'\txxxx"]

例7 --re.S作用

import re
mystr="""
"o":"love/never/felt/so/good
.jpg"
"""
pic = re.findall('love/(.*)"',mystr,re.S)
print(pic)
#[]

import re
mystr="""
"o":"love/never/felt/so/good
.jpg"
"""
pic = re.findall('love/(.*)"',mystr,re.S)
print(pic)

#['never/felt/so/good\n.jpg']
注意"结尾 
没有re.S只在一行匹配,if这行没有,就从下一行重新匹配,if有,将整个字符串作为整体匹配

例8–{m} 匹配m个值

import re
mystr='1 2 3 4 5'
pattern=re.compile(r'(\d\s){2}')  # 正则pattern之前还有空格
result=re.findall(pattern,mystr)
print(result) #['2 ', '4 ']

例子9–

验证日期的正则表达式

未使用非捕获组的正则:
^((?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)|([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$

使用非捕获组的正则:
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$

匹配HH:mm:ss格式时间
正则表达式:([01][0-9]|2[0-3]) (:[0-5][0-9]){2}

匹配0100的数字
正则表达式:^([1-9]?[0-9]|100)$

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值