python-正则表达式Re模块使用详解

import re
re.match() #从字符串开头往后匹配,^在这里没有用,本来就是从头开始
re.search() #匹配包含,从整个文本里去搜索,searech到1个就返回
re.findall() #匹配到的所有都返回,把所有匹配到的字符放到以列表中的元素返回
re.split() #以匹配到的字符当作列表分隔符
re.sub() #匹配字符并替换
'.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
print(re.match('.',"Chen321RongHua123"))    #只匹配到C
print(re.search("R.+","Chen321Ronghua123"))   #匹配到RongHua123
'^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
res = re.match("^Chen","ChenRongHua123")   #有值就是匹配到了
print(res)
print(res.group())    #匹配到了什么,这里就是匹配到Chen

'$' 匹配字符结尾,或re.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以

'*' 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac")结果为【‘abb','ab','a'】
'+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba")结果为【'ab','abb'】
'?' 匹配前一个字符1次或0次

print(re.search("aal?","aaexaaa"))   #匹配到aa,匹配?前面的一次或0次,即aal的l可以有或没有

'{m}'匹配前一个字符m次

print(re.search("[0-9]{3}","aa1x2a345aa"))   #匹配到'345'

'{n,m}'匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb")结果为【‘abb','ab','abb'】

print(re.search("[0-9]{1,3}","aa1x2a345aa"))   #匹配到'1'
print(re.findall("[0-9]{1,3}","aa1x2a345aa"))   #结果['1', '2', '345']

'|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group()结果'ABC'

print(re.search("abc|ABC","ABCBabcCD").group())   #结果ABC
print(re.findall("abc|ABC","ABCBabcCD"))   #结果['ABC', 'abc'],findall没有group方法

'(...)'分组匹配,re.search("(abc){2}a(123|456)c","abcabca456c")).group()  结果abcabca456c

print(re.search("abc{2}","alexabccc"))   #匹配到'abcc'
print(re.search("(abc){2}","alexabcabc"))   #匹配到'abcabc'
print(re.search("(abc){2}(\|\|=){2}","alexabcabc||=||="))   #匹配到'abcabc||=||=',匹配'|'要加'\'转译

'\A' 只从字符开头匹配,re.search("\Aabc","alexabc")是匹配不到的
'\Z' 匹配字符结尾,同$

print(re.search("\A[0-9]+[a-z]\Z","123a"))   #匹配到'123a'

'\d' 匹配数字0-9

res = re.match("^Chen\d+","Chen321RongHua123")  #\d代表一个数字,\d+代表一个或多个数字
print(res.group())

'\D' 匹配非数字

print(re.search("\D+","123$- a"))   #匹配到'$- a'

'\w' 匹配[A-Za-z0-9]

print(re.search("\w+","a123$- \\na"))   #匹配到'a123'

'\W' 匹配非[A-Za-z0-9]

print(re.search("\W+","a123$- \\na"))   #匹配到'$- \\'

's' 匹配空白字符、\t、\n、\r,re.search("\s+","ab\tc1\n3").group()结果'\t'

print(re.search("R[a-z]","Chen321Ronghua123"))   #匹配到Ro,[a-z]只匹配一个字符
print(re.search("R[a-z]+a","Chen321Ronghua123"))  #匹配到Ronghua,[a-z]+匹配多个字符,以a结尾,【a-z]只识别小写
print(re.search("R[a-zA-Z]+a","Chen321RongHua123"))  #匹配到RongHua,【A-Z]识别大写
print(re.search("#.+#","1123#hello#"))  #匹配到#hello#

'(?P<name>...' 分组匹配

print(re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") )  #结果{'province': '3714', 'city': '81', 'birthday': '1993'}
print(re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").group("city") )  #结果81
print(re.split("[0-9]","abc12de3f45GH"))   #结果['abc', '', 'de', 'f', '', 'GH']
print(re.split("[0-9]+","abc12de3f45GH"))   #结果['abc', 'de', 'f', 'GH']
print(re.sub("[0-9]+","|","abc12de3f45GH"))  #结果abc|de|f|GH
print(re.sub("[0-9]+","|","abc12de3f45GH",count=2))  #只换前两个,结果abc|de|f45GH

反斜杠的困扰
与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

print(re.search(r"\\","abc12de\\3f45GH"))   #结果'\\'

仅需轻轻知道的几个匹配模式
re.I(re.IGNORECASE):忽略大小写(括号内是完整写法,下同)
M(MULTILINE):多行模式,改变'^'和'$'的行为(参见上图)
S(DOTALL):点任意匹配模式,改变'.'的行为

print(re.search("[a-z]+","abcdA",flags=re.I))   #结果'abcdA'
print(re.search("[a-z]+d$","abcdA\nsecondline\nthird",flags=re.M))   #结果'third'
print(re.search(".+","\nabc\neee",flags=re.S))   #结果'\nabc\neee'
posted @ 2019-12-09 17:00  忆梦,惊梦  阅读(476)  评论(0)    收藏  举报