例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}
匹配0到100的数字
正则表达式:^([1-9]?[0-9]|100)$