就其本質而言,正則表達式(或 RE)是一種小型的、高度專業化的編程語言,(在Python中)它內嵌在Python中,並經過 re 模塊實現。你能夠爲想要匹配的相應字符串集指定規則;該字符串集可能包含英文語句、e-mail地址、TeX命令或任何你想搞定的東西。而後你能夠問諸如「這個字符串匹配該模式嗎?」或「在這個字符串中是否有部分匹配該模式呢?」。你也可使用 RE 以各類方式來修改或分割字符串。因此今天就來說講這個模塊:re模塊。python
'.' 默認匹配除\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-z] 匹配[a-z] [A-Z] 匹配[A-Z] [0-9] 匹配數字0-9 '\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(pattern, string, flags=0)正則表達式
說明:在string的開始處匹配模式編程
>>> import re >>> a = re.match('in',"inet addr:10.161.146.134") #從頭開始匹配in字符 >>> a.group() 'in' >>> a = re.match('addr',"inet addr:10.161.146.134") #開頭匹配不到,因此返回none >>> print(a) None
二、re.search(pattern, string, flags=0)編程語言
說明:在string中尋找模式spa
>>> import re >>> a = re.search('addr',"inet addr:10.161.146.134") #在字符串中尋找 >>> a.group() 'addr'
三、re.findall(pattern, string, flags=0)code
說明:把匹配到的字符以列表的形式返回對象
>>> import re >>> re.findall('[0-9]{1,3}',"inet addri:10.161.146.134") ['10', '161', '146', '134'] #符合條件的以列表的形式返回
四、re.split(pattern, string, maxsplit=0, flags=0)blog
說明:匹配到的字符被當作列表分割符索引
>>> import re >>> re.split('\.',"inet addri:10.161.146.134") ['inet addri:10', '161', '146', '134']
五、re.sub(pattern, repl, string, count=0, flags=0)ci
說明:匹配字符並替換
>>> import re >>> re.sub('\.','-',"inet addri:10.161.146.134") 'inet addri:10-161-146-134' #默認所有替換 >>> re.sub('\.','-',"inet addri:10.161.146.134",count=2) 'inet addri:10-161-146.134' #用count控制替換次數
六、finditer(pattern, string)
說明:返回迭代器
>>> import re >>> re.finditer('addr',"inet addr:10.161.146.134") <callable_iterator object at 0x00000000030C4BE0> #返回一個迭代器
一、group([group1, ...])
說明:得到一個或多個分組截獲的字符串;指定多個參數時將以元組形式返回。group1可使用編號也可使用別名;編號0表明整個匹配的子串;不填寫參數時,返回group(0);沒有截獲字符串的組返回None;截獲了屢次的組返回最後一次截獲的子串。
>>> import re >>> a = re.search('addr',"inet addr:10.161.146.134") >>> a.group() 'addr' >>> a.group(0) 'addr'
二、groups(default=None)
說明:以元組形式返回所有分組截獲的字符串。至關於調用group(1,2,…last)。default表示沒有截獲字符串的組以這個值替代,默認爲None。這個要跟分組匹配結合起來使用'(...)'
>>> import re >>> a = re.search("(\d{2})(\d{2})(\d{2})(\d{4})","320922199508083319") #一個小括號表示一個組,有4個括號,就是4個組 >>> a.groups() ('32', '09', '22', '1995')
三、groupdict(default=None)
說明:返回以有別名的組的別名爲鍵、以該組截獲的子串爲值的字典,沒有別名的組不包含在內。default含義同上。這個是跟另一個分組匹配結合起來用的,即:'(?P<name>...)'
>>> import re >>> a = re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242") #如下兩種狀況獲取的值都是同樣的 >>> a.groupdict() {'birthday': '1993', 'city': '81', 'province': '3714'} >>> a.groupdict("city") {'birthday': '1993', 'city': '81', 'province': '3714'}
四、span([group])
說明:返回(start(group), end(group))
>>> import re >>> a = re.search('addr',"inet addr:10.161.146.134") >>> a.group() 'addr' >>> a.span() #獲取'addr'在字符串中的開始位置和結束位置 (5, 9)
五、start([group])
說明:返回指定的組截獲的子串在string中的起始索引(子串第一個字符的索引),group默認值爲0。
>>> import re >>> a = re.search('addr',"inet addr:10.161.146.134") >>> a.group() 'addr' >>> a.span() (5, 9) >>> a.start() #獲取字符串的起始索引 5
六、end([group])
說明:返回指定的組截獲的子串在string中的結束索引(子串最後一個字符的索引+1),group默認值爲0。
>>> import re >>> a = re.search('addr',"inet addr:10.161.146.134") >>> a.group() 'addr' >>> a.span() (5, 9) >>> a.end() #獲取string中的結束索引 9
7、compile(pattern[, flags])
說明:根據包含正則表達式的字符串建立模式對象
>>> import re >>> m = re.compile("addr") #建立正則模式對象 >>> n = m.search("inet addr:10.161.146.134") #經過模式對象去匹配 >>> n.group() 'addr'
與大多數編程語言相同,正則表達式裏使用"\"做爲轉義字符,這就可能形成反斜槓困擾。假如你須要匹配文本中的字符"\",那麼使用編程語言表示的正則表達式裏將須要4個反斜槓"\\\\":前兩個和後兩個分別用於在編程語言裏轉義成反斜槓,轉換成兩個反斜槓後再在正則表達式裏轉義成一個反斜槓。Python裏的原生字符串很好地解決了這個問題,這個例子中的正則表達式可使用r"\\"表示。一樣,匹配一個數字的"\\d"能夠寫成r"\d"。有了原生字符串,你不再用擔憂是否是漏寫了反斜槓,寫出來的表達式也更直觀。
>>> import re >>> a = re.split("\\\\","C:\ \zhangqigao\yhd_settings") >>> a ['C:', ' ', 'zhangqigao', 'yhd_settings'] >>> re.findall('\\','abc\com') Traceback (most recent call last) >>> re.findall('\\\\','abc\com') ['\\'] >>> re.findall(r'\\','abc\com') ['\\']
一、re.I(re.IGNORECASE
)
說明:忽略大小寫(括號內是完整的寫法,下同)
>>> import re >>> a = re.search('addr',"inet Addr:10.161.146.134",flags=re.I) >>> a.group() 'Addr' #忽略大小寫
二、re.M(MULTILINE
)
說明:多行模式,改變'^'和'$'的行爲,詳細請見第2點
>>> import re >>> a = re.search('^a',"inet\naddr:10.161.146.134",flags=re.M) >>> a.group() 'a'
三、re.S(DOTALL
)
說明:點任意匹配模式,改變'.'的行爲
>>> import re >>> a = re.search('.+',"inet\naddr:10.161.146.134",flags=re.S) >>> a.group() 'inet\naddr:10.161.146.134'
注意:上面這三種匹配模式,知道就行。
一、用r''的方式表示的字符串叫作raw字符串,用於抑制轉義。二、正則表達式使用反斜杆(\)來轉義特殊字符,使其能夠匹配字符自己,而不是指定其餘特殊的含義。三、這可能會和python字面意義上的字符串轉義相沖突,這也許有些使人費解,好比,要匹配一個反斜杆自己,你也許要用'\\\\'來作爲正則表達式的字符串,由於正則表達式要是\\,而字符串裏,每一個反斜杆都要寫成\\。四、你也能夠在字符串前加上 r 這個前綴來避免部分疑惑,由於 r 開頭的python字符串是 raw 字符串,因此裏面的全部字符都不會被轉義,好比r'\n'這個字符串就是一個反斜杆加上一字母n,而'\n'咱們知道這是個換行符。所以,上面的'\\\\'你也能夠寫成r'\\',這樣,應該就好理解不少了。