python3 re正則模塊
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'>
python3 re正則模塊