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'

浙公网安备 33010602011771号