一、常用的正则表达式:
1、".":默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
2、"^":匹配字符开头,若指定flag MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
3、"$":匹配字符结尾,或re.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
4、"*":匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac")结果为["abb","ab","a"]
5、"+":匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba")结果为["ab","abb"]
6、"?":匹配前一个字符1次或0次
7、"{m}":匹配前一个字符m次
8、"{n,m}":匹配前一个字符n次到m次,re.findall("ab{1,3}","abb abc abbcbbb")结果为["abb","ab","abb"]
9、"|":匹配"|"左或"|"右的字符,re.search("abc|ABC","ABCBabcCD").group()结果["ABC"]
10、"(...)":分组匹配,re.search("(abc){2}a(123|456)c","abcabca456c").group()结果为"abcabca456c"
11、"\A":只从字符开头匹配,re.search("\Aabc","Xiaoabc")是匹配不到的
12、"\Z":匹配字符结尾,同"$"
13、"\d":匹配数字0-9
14、"\D":匹配非数字
15、"\w":匹配[A-Za-z0-9]
16、"\W":匹配非[A-Za-z0-9]
17、"\s":匹配空白字符,\t、\n、\r,re.search("\s+","ab\tc1\n3").group()结果为"\t"
18、"(?P<name>...)":分组匹配,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'}
二、匹配模式
1、match:从字符开头往后匹配,^在此模式下没有用
2、search:从整个文本去搜索,如果出现一次则返回
3、findall:返回所有匹配到的值,此模式没有group方法
4、split:可以起到分割作用
5、sub:替换,也是就是匹配到之后替换
三、示例
1、>>> re.match("Xiao\d+","Xiao123Ming321") //表示匹配数字一次或多次
<_sre.SRE_Match object; span=(0, 7), match='Xiao123'>
2、>>> re.match("M.+g$","Xiao123Ming321") //想把Ming取出来的话,使用match是不好使的,要使用search模式
>>> re.search("M[a-z]+a","Xiao123Ming321a") //注意看这两个正则的含义
>>> re.search("M[a-z]+a$","Xiao123Ming321a")
>>> re.search("M[a-z]+","Xiao123Ming321a") //此处是正确匹配"Ming",如果字符串为"Xiao123MINg321a",匹配条件应该为"M[a-zA-Z]+"
<_sre.SRE_Match object; span=(7, 11), match='Ming'>
3、>>> re.search("#.+#","123#hello#") //匹配"#"和"#"之间有任意字符
<_sre.SRE_Match object; span=(3, 10), match='#hello#'>
4、>>> re.search("aaa?","aabcaaa") //"?"匹配前面的字符0次或1次,"aa?"就是匹配第二个a0次或一次,"aaa?"就是匹配第三个a0次或1次
<_sre.SRE_Match object; span=(0, 2), match='aa'>
>>> re.search("aaa?","abcaaa")
<_sre.SRE_Match object; span=(3, 6), match='aaa'>
5、>>> re.search("[0-9]{3}","a1b2c123aaa") //[0-9]{3}匹配任意数字3次
<_sre.SRE_Match object; span=(5, 8), match='123'>
>>> re.search("[0-9]{1,3}","a1b2c123aaa") //[0-9]{1,3}匹配数字最少一次,最多三次,如果想全部匹配出数字,需要用findall匹配模式
<_sre.SRE_Match object; span=(1, 2), match='1'>
>>> re.findall("[0-9]{1,3}","a1b2c123aaa")
['1', '2', '123']
6、>>> re.search("abc|ABC","ABC2c123abc") //"|"为或者的意思
<_sre.SRE_Match object; span=(0, 3), match='ABC'>
7、>>> re.search("abc{2}","ABC2c123abcc")
<_sre.SRE_Match object; span=(8, 12), match='abcc'>
>>> re.search("(abc){2}","ABC2c123abcabc") //(...)意思是把括号中的字符当做一个整体
<_sre.SRE_Match object; span=(8, 14), match='abcabc'
>>> re.search("(abc){2}(\|\|=){2}","ABC2c123abcabc||=||=") //"="不需要转义
<_sre.SRE_Match object; span=(8, 20), match='abcabc||=||='>
8、>>> re.search("\A[0-9]+[a-z]\Z","1213213a") //\A等同于"^",\Z等同于"$"
<_sre.SRE_Match object; span=(0, 8), match='1213213a'>
9、>>> re.search("\D+","$- \n\ta") //"\D"匹配除数字之外的任意字符,包括\n、\t
<_sre.SRE_Match object; span=(0, 7), match='$- \n\ta'>
10、>>> re.search("(?P<id>[0-9]+)(?P<name>[A-Za-z]+)","abc23ccc").groupdict() //可以把匹配的东西设置为字典
{'id': '23', 'name': 'ccc'}
>>> a =re.search("(?P<id>[0-9]+)(?P<name>[A-Za-z]+)","abc23ccc").groupdict()
>>> print(a["name"])
ccc
>>> a =re.search("(?P<id>[0-9]+)(?P<name>[A-Za-z]+)","abc23ccc").group("name")
>>> print(a)
ccc
11、>>> re.split("[0-9]","abc12def3d") //split可以对字符串进行分割
['abc', '', 'def', 'd']
>>> re.split("[0-9]+","abc12def3d")
['abc', 'def', 'd']
12、>>> re.sub("[0-9]","A","abc12def3d") //"[0-9]"为匹配模式,"A"匹配到之后要改为的值
'abcAAdefAd'
>>> re.sub("[0-9]","A","abc12def3d",count=2) //count指定只替换前N个
'abcAAdef3d'
13、>>> re.search(r"\\","abc12d\\ef3d") //匹配两个反斜杠
<_sre.SRE_Match object; span=(6, 7), match='\\'>
14、>>> re.search("[a-z]+","abcABC",flags=re.I) //flags=re.I为忽略大小写
<_sre.SRE_Match object; span=(0, 6), match='abcABC'>
15、>>> re.search("^a","\nabcABC\ndd\nccde") //匹配不到
>>> re.search("^a","\nabcABC\ndd\nccde",flags=re.M)
<_sre.SRE_Match object; span=(1, 2), match='a'>
16、>>> re.search(".+","\nabcABC\ndd\nccde")
<_sre.SRE_Match object; span=(1, 7), match='abcABC'>
>>> re.search(".+","\nabcABC\ndd\nccde",flags=re.S) //flags=re.S也可匹配\n
<_sre.SRE_Match object; span=(0, 15), match='\nabcABC\ndd\nccde'>