1. 程式人生 > >python3 re正則模塊

python3 re正則模塊

python基礎 python正則表達式使用 python 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正則模塊