Python高手之路【五】python基础之正则表达式
下图列出了Python支持的正则表达式元字符和语法:
字符点:匹配任意一个字符
import re<br/> st = 'python'<br/> result = re.findall('p.t',st)<br/> print(result)
字符^:匹配以什么开头
import re<br/> st = 'python'<br/> result = re.findall('^py',st)<br/> print(result)
字符$:匹配以什么结尾
import re<br/> st = 'python'<br/> result = re.findall('n$',st)<br/> print(result)
字符*:匹配任意次,包括0次
import re<br/> st = 'I looooooove python'<br/> result = re.findall('lo*ve',st)#字符0可以没有,也可以无限多个,都可以匹配<br/> print(result)
字符+:匹配一次或多次
import re<br/> st = 'I looooooove python'<br/> result = re.findall('lo+ve',st)#字符0没有就匹配不上<br/> print(result)
字符?:匹配0次或一次
import re<br/> st = 'I love python'<br/> result = re.findall('lo?ve',st)#字符0没有也能匹配<br/> print(result)
{m}:匹配前一个字符的m次
import re<br/> st = 'I loooove python'<br/> result = re.findall('o{3}',st)#匹配3个o字符<br/> print(result)
{m,n}:匹配前一个字符的m-n次
import re<br/> st = 'I loooove python'<br/> result = re.findall('lo{1,4}ve',st)<br/> print(result)
[abc]或[a-c]:匹配[]中的任意一个字符
import re<br/> st = 'I loooove python'<br/> result = re.findall('l[0-z]*e',st)<br/> print(result)
[a|b]:匹配字符a或字符b
import re<br/> st = 'I lbve python'<br/> result = re.findall('l[a|b]ve',st)<br/> print(result)
[^1-9]:[]里出现^字符,表示非的意思,并不表示以什么开头的意思
import re<br/> st = 'I lb2ve python6'<br/> result = re.findall('[^0-9]',st)<br/> print(result)<br/> ##########################################<br/> ['I', ' ', 'l', 'b', 'v', 'e', ' ', 'p', 'y', 't', 'h', 'o', 'n']
\:
- 反斜杠后边跟元字符去除特殊功能
- 反斜杠后边跟普通字符实现特殊功能
- 引用序号对应的字组所匹配的字符串
数量词的贪婪模式与非贪婪模式
正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式”ab*”如果用于查找”abbbc”,将找到”abbb”。而如果使用非贪婪的数量词”ab*?”,将找到”a”。
import re<br/> result = re.findall(r'ab*','abbbc')<br/> print(result)<br/> ##########################################<br/> ['abbb']
import re<br/> result = re.findall(r'ab*?','abbbc')#取消贪婪模式<br/> print(result)<br/> ##########################################<br/> ['a']
re.match() 从头匹配
import re<br/> origin = "hello poe bcd jet who are you 20"<br/> r = re.match("h\w+",origin)<br/> print(r.group()) #获取匹配到的所有结果<br/> print(r.groups()) #获取模型中匹配到的分组结果<br/> print(r.groupdict()) #获取模型中匹配到的分组结果<br/> ##########################################<br/> hello<br/> ()<br/> {}
r = re.match("(h)(\w+)",origin)<br/> print(r.group()) #获取匹配到的所有结果<br/> print(r.groups()) #获取模型中匹配到的分组结果<br/> print(r.groupdict()) #获取模型中匹配到的分组结果<br/> ##########################################<br/> hello<br/> ('h', 'ello')<br/> {}
r = re.match("(?P<n1>h)(?P<n2>\w+)",origin)<br/> # ?P<n1> :以键为n1,值为匹配到的这个分组,保存到字典中!?P<>这个是固定的写法<br/> print(r.group()) #获取匹配到的所有结果<br/> print(r.groups()) #获取模型中匹配到的分组结果<br/> print(r.groupdict()) #获取模型中匹配到的分组结果<br/> ##########################################<br/> hello<br/> ('h', 'ello')<br/> {'n2': 'ello', 'n1': 'h'}
re.search() 浏览全部字符串,匹配第一个符合规则的字符串
与re.match()用法基本一样
import re<br/> origin = "hello poe bcd jet poe who are you 20"<br/> r = re.search("p(\w+).*(?P<name>\d)$",origin)<br/> # ?P<n1> :以键为n1,值为匹配到的这个分组,保存到字典中!?P<>这个是固定的写法<br/> print(r.group()) #获取匹配到的所有结果<br/> print(r.groups()) #获取模型中匹配到的分组结果<br/> print(r.groupdict()) #获取模型中匹配到的分组结果<br/> ##########################################<br/> poe bcd jet poe who are you 20<br/> ('oe', '')<br/> {'name': ''}
re.findall() 将匹配的所有内容都放置在一个列表中
注:此方法空匹配也会保存到结果中,如:
result = re.findall("","a2b3c4d5")<br/> print(result)<br/> print(len(result))<br/> ##########################################<br/> ['', '', '', '', '', '', '', '', '']
re.findall()方法要注意有分组的情况:
#没有分组的情况<br/> r = re.findall("p\w+",origin)<br/> print(r)<br/> ##########################################<br/> ['poe', 'poe']
#有分组的情况,会把匹配到的分组放到结果列表中<br/> r = re.findall("p(\w+)",origin)<br/> print(r)<br/> ##########################################<br/> ['oe', 'oe']
re.finditer()
import re<br/> origin = "hello poe bcd jet poe who are you 20"<br/> r = re.finditer("(p)(\w+(e))",origin)<br/> for i in r :<br/> print(i.group())<br/> print(i.groups())<br/> print(i.groupdict())
re.split()
无分组情况,匹配到的字符串不会出现在匹配结果中:
import re<br/> origin = "hello poe bcd jet poe who are you 20"<br/> r = re.split("a\w+",origin,1)<br/> print(r)<br/> ##########################################<br/> ['hello poe bcd jet poe who ', ' you 20']
有分组情况,匹配到的分组字符串也会出现在匹配结果中:
import re<br/> origin = "hello poe bcd jet poe who are you 20"<br/> r = re.split("a(\w+)",origin,1)<br/> print(r)<br/> ##########################################<br/> ['hello poe bcd jet poe who ', 're', ' you 20']
re.sub() 正则替换
import re<br/> origin = "1yiuoosfd234kuiuadf789v,xznfa978"<br/> new_str = re.sub("\d+","KKK",origin,1)#参数1表示只替换匹配到的第一个字符串,如果是2表示替换匹配到的前2个字符串<br/> print(new_str)<br/> ##########################################<br/> KKKyiuoosfdKKKkuiuadf789v,xznfa978
re.subn()只是比re.sub()多返回一个数据,如:
import re<br/> origin = "1yiuoosfd234kuiuadf789v,xznfa978"<br/> new_str,count = re.subn("\d+","KKK",origin)#参数1表示只替换匹配到的第一个字符串<br/> print(new_str,count)<br/> ##########################################<br/> KKKyiuoosfdKKKkuiuadfKKKv,xznfaKKK 4