Python 中的正則,本質上是嵌入在Python中的一種微小的、高度專業化的程式語言,可通過
re
這個內建模組獲得。
正則表達式模式幾乎和 shell 中的一樣,更接近grep -P
的效果,因爲 Python 中的re
模組提供的是類似
Perl 語言中的正則表達式。 正則表達式模式會被編譯成一系列位元組碼,然後由用 C 編寫的匹配引擎執行。
友情提示:
正則表達式語言相對較小且受限制,因此並非所有可能的字串處理任務都可以使用正則表達式完成。
還有一些任務 可以 用正則表達式完成,但表達式變得非常複雜。 在這些情況下,你最好編寫 Python 程式碼來進行處理;雖然 Python
程式碼比精心設計的正則表達式慢,但它也可能更容易理解。
3.特殊字元
在 Python 中有一些特殊的字元,在正則表達式模式中的作用和 shell 和 grep -P
時候有一些細微的差別
正則特殊字元 匹配內容 \w
匹配單個字母、數位、漢字(shell中沒有)或下劃線 類似於 [a-zA-Z0-9_]
\d
匹配單個數字 類似於 [0-9]
\s
匹配單個任意的空白符,這等價於 [ \t\n\r\f\v]
\S
匹配任何非空白字元, [^ \t\n\r\f\v]
match()就看開頭有沒有,只看整個字串開始的位置。
舉例:
s = "isinstance yangge enumerate www.qfedu.com 1997"
import re
In [4]: r = re.match("is\w+", s)
In [8]: r.group() # 獲取匹配成功的結果
Out[8]: 'isinstance'
search()只查第一個匹配的
從整個字串的開頭找到最後,當地一個成功匹配後,就停止匹配。
In [9]: r = re.search("a\w+", s)
In [10]: r.group()
Out[10]: 'ance'
findall() 查到所有
搜尋整個字串,找到所有匹配成功的字串,比把這些字串放在一個列表中返回。
In [16]: r = re.findall("a\w+", s)
In [17]: r
Out[17]: ['ance', 'angge', 'ate']
sub() 替換
把匹配成功的字串,進行替換。
#語法:
"""
("a\w+", "100", s, 2)
匹配規則,替換成的新內容, 被搜尋的物件, 有相同的話替換的次數
"""
In [24]: r = re.sub("a\w+", "100", s, 2)
In [25]: r
Out[25]: 'isinst100 y100 enumerate www.qfedu.com 1997'
#模式不匹配時,返回原來的值
split() 分割
和 awk -F '[d]'
一樣效果,以匹配到的字元進行分割,返回分割後的列表
In [26]: s
Out[26]: 'isinstance yangge enumerate www.qfedu.com 1997'
In [27]: r = re.split("a", s, 1) #1 分割第一個a
使用多個界定符分割字串
line = 'asdf fjdk; afed, fjek,asdf, foo'
import re
re.split(r'[;,\s]\s*', line)
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']
\b :匹配邊界
2.正則分組
就是從已經成功匹配的內容中,再去把想要的取出來
#match
In [64]: s
Out[64]: 'isinstance yangge enumerate www.qfedu.com 1997'
In [65]: r = re.match("is(\w+)", s)
In [66]: r.group()
Out[66]: 'isinstance'
In [67]: r.groups()
Out[67]: ('instance',)
#search
#命名分組
In [87]: r = re.search("is\w+\s(?P<name>y\w+e)", s) #y開頭e結尾中間任意多個字元
In [88]: r.group() #拿正則搜到的所有值
Out[88]: 'isinstance yangge'
In [89]: r.groups() #只拿括號裡的
Out[89]: ('yangge',)
In [90]: r.groupdict() #將括號裡的以字典形式拿出
Out[90]: {'name': 'yangge'}
#findall
In [98]: s
Out[98]: 'isinstance yangge enumerate www.qfedu.com 1997'
In [99]: r = re.findall("a(\w+)", s)
In [100]: r
Out[100]: ['nce', 'ngge', 'ny', 'te']