re模塊

1、簡述

  就其本質而言,正則表達式(或 RE)是一種小型的、高度專業化的編程語言,(在Python中)它內嵌在Python中,並經過 re 模塊實現。你能夠爲想要匹配的相應字符串集指定規則;該字符串集可能包含英文語句、e-mail地址、TeX命令或任何你想搞定的東西。而後你能夠問諸如「這個字符串匹配該模式嗎?」或「在這個字符串中是否有部分匹配該模式呢?」。你也可使用 RE 以各類方式來修改或分割字符串。因此今天就來說講這個模塊:re模塊。python

2、經常使用的正在表達式符號

'.'     默認匹配除\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'}

3、經常使用的匹配方法

一、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>  #返回一個迭代器

4、經常使用方法

一、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'

5、反斜槓的困擾

  與大多數編程語言相同,正則表達式裏使用"\"做爲轉義字符,這就可能形成反斜槓困擾。假如你須要匹配文本中的字符"\",那麼使用編程語言表示的正則表達式裏將須要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')
['\\']

6、其餘匹配模式

一、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'

注意:上面這三種匹配模式,知道就行。

7、總結

一、用r''的方式表示的字符串叫作raw字符串,用於抑制轉義。二、正則表達式使用反斜杆(\)來轉義特殊字符,使其能夠匹配字符自己,而不是指定其餘特殊的含義。三、這可能會和python字面意義上的字符串轉義相沖突,這也許有些使人費解,好比,要匹配一個反斜杆自己,你也許要用'\\\\'來作爲正則表達式的字符串,由於正則表達式要是\\,而字符串裏,每一個反斜杆都要寫成\\。四、你也能夠在字符串前加上 r 這個前綴來避免部分疑惑,由於 r 開頭的python字符串是 raw 字符串,因此裏面的全部字符都不會被轉義,好比r'\n'這個字符串就是一個反斜杆加上一字母n,而'\n'咱們知道這是個換行符。所以,上面的'\\\\'你也能夠寫成r'\\',這樣,應該就好理解不少了。

相關文章
相關標籤/搜索