python中的正則表達式

2020-08-13 21:06:28

一.預備知識正則

1.正則介紹

Python 中的正則,本質上是嵌入在Python中的一種微小的、高度專業化的程式語言,可通過 re 這個內建模組獲得。
正則表達式模式幾乎和 shell 中的一樣,更接近 grep -P 的效果,因爲 Python 中的 re 模組提供的是類似
Perl 語言中的正則表達式。 正則表達式模式會被編譯成一系列位元組碼,然後由用 C 編寫的匹配引擎執行。

2.陷阱

友情提示:

正則表達式語言相對較小且受限制,因此並非所有可能的字串處理任務都可以使用正則表達式完成。

還有一些任務 可以 用正則表達式完成,但表達式變得非常複雜。 在這些情況下,你最好編寫 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]

二.re模組

1.常用方法

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']