python3 正則表達式模塊re相關

# -*- coding:utf-8 -*-
# Author: Evan Mi
import re
"""
'.'     默認匹配除\n之外的任意一個字符,若指定flag DOTALL,則匹配任意字符,包括換行
'^'     匹配字符開頭,若指定flags MULTILINE,這種也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$'     匹配字符結尾,或e.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次
'{m}'   匹配前一個字符m次
'{n,m}' 匹配前一個字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 結果['abb', 'ab', 'abb']
'|'     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 結果'ABC'
'(...)' 分組匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 結果 abcabca456c
 
 
'\A'    只從字符開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的
'\Z'    匹配字符結尾,同$
'\d'    匹配數字0-9
'\D'    匹配非數字
'\w'    匹配[A-Za-z0-9]
'\W'    匹配非[A-Za-z0-9]
's'     匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 '\t'
'(?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'}


最常用的匹配語法
re.match 從頭開始匹配
re.search 匹配包含
re.findall 把所有匹配到的字符放到以列表中的元素返回

string="abcdefg  acbdgef  abcdgfe  cadbgfe"

regex=re.compile("((\w+)\s+\w+)")
print(regex.findall(string))
#輸出:[('abcdefg  acbdgef', 'abcdefg'), ('abcdgfe  cadbgfe', 'abcdgfe')]
解釋一下爲什麼這樣的結果?很簡單,當我們忽略括號,對整個字符串進行匹配的時候,要求是一到多個字母空格一到多個字母;
所以有兩個結果'abcdefg  acbdgef'和'abcdgfe  cadbgfe',但是我們是有括號的,所以給結果也加上括號,結果就變成了
'((abcdefg)  acbdgef)'和'((abcdgfe)  cadbgfe)',然而findall要返回括號裏面的內容,而我們這裏匹配了兩次,每次有兩個括號,
所以只好把每次的兩個括號放在一個tuple中來區別哪此匹配的,tuple中的內容就是兩個括號中的值;所以結果爲:
[('abcdefg  acbdgef', 'abcdefg'), ('abcdgfe  cadbgfe', 'abcdgfe')]

regex1=re.compile("(\w+)\s+\w+")
print(regex1.findall(string))
#輸出:['abcdefg', 'abcdgfe']
解釋一下爲什麼這樣的結果?很簡單,當我們忽略括號,對整個字符串進行匹配的時候,要求是一到多個字母空格一到多個字母;
所以有兩個結果'abcdefg  acbdgef'和'abcdgfe  cadbgfe',但是我們是有括號的,所以給結果也加上括號,結果就變成了
'(abcdefg)  acbdgef'和'(abcdgfe)  cadbgfe',然而findall只返回括號裏面的內容,所以結果是
['abcdefg','abcdgfe']


regex2=re.compile("\w+\s+\w+")
print(regex2.findall(string))
#輸出:['abcdefg  acbdgef', 'abcdgfe  cadbgfe']
解釋一下,這個沒有括號了,兩次匹配到的結果就是'abcdefg  acbdgef'和'abcdgfe  cadbgfe';沒有括號,就在最外層默認加個括號,
變成了'(abcdefg  acbdgef)'和'(abcdgfe  cadbgfe)';所以結果是
['abcdefg  acbdgef', 'abcdgfe  cadbgfe'];

findall()返回的是括號所匹配到的結果(如regex1),多個括號就會返回多個括號分別匹配到的結果(如regex),
如果沒有括號就返回就返回整條語句所匹配到的結果(如regex2)。所以在提取數據的時候就需要注意這個坑


print(re.sub('(.)\\1*', "2", test)) \1是代表第一個括號中的值
print(re.findall('(.)\\1*', test))
re.split 以匹配到的字符當做列表分隔符
re.sub      匹配字符並替換
"""

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章