Python3 如何優雅地使用正規表示式(詳解三)

2021-09-20 21:49:10 字數 2604 閱讀 2494

使用正規表示式也並非一定要建立模式物件,然後呼叫它的匹配方法。因為,re 模組同時還提供了一些全域性函式,例如 match(),search(),findall(),sub() 等等。這些函式的第乙個引數是正規表示式字串,其他引數跟模式物件同名的方法採用一樣的引數;返回值也一樣,同樣是返回 none 或者匹配物件。

>>

>

print

(re.match(r'from\s+'

,'from_fishc.com'))

none

>>

> re.match(r'from\s+'

,'from fishc.com'

)<_sre.sre_match object

; span=(0

,5), match=

'from '

>

那我們到底是應該直接使用這些模組級別的函式呢,還是先編譯乙個模式物件,再呼叫模式物件的方法呢?這其實取決於正規表示式的使用頻率,如果說我們這個程式只是偶爾使用到正規表示式,那麼全域性函式是比較方便的;如果我們的程式是大量的使用正規表示式(例如在乙個迴圈中使用),那麼建議你使用後一種方法,因為預編譯的話可以節省一些函式呼叫。但如果是在迴圈外部,由於得益於內部快取機制,兩者效率相差無幾。

編譯標誌讓你可以修改正規表示式的工作方式。在 re 模組下,編譯標誌均有兩個名字:完整名和簡寫,例如 ignorecase 簡寫是 i(如果你是 perl 的粉絲,那麼你有福了,因為這些簡寫跟 perl 是一樣的,例如 re.verbose 的簡寫是 re.x)。另外,多個標誌還可以同時使用(通過「|」),如:re.i | re.m 就是同時設定 i 和 m 標誌。

下邊列舉一些支援的編譯標誌:

標誌含義

ascii, a

使得轉義符號如 \w,\b,\s 和 \d ;只能匹配 ascii 字元

dotall, s

使得.匹配任何符號,包括換行符

ignorecase, i

匹配的時候不區分大小寫

locale, l

支援當前的語言(區域)設定

multiline, m

多行匹配,影響^ 和 $

verbose, x (for 'extended')

啟用詳細的正規表示式

下面我們來詳細講解一下它們的含義:

aascii

使得 \w,\w,\b,\b,\s 和 \s 只匹配 ascii 字元,而不匹配完整的 unicode 字元。這個標誌僅對 unicode 模式有意義,並忽略位元組模式。

sdotall

使得.可以匹配任何字元,包括換行符。如果不使用這個標誌,. 將匹配除了換行符的所有字元。

iignorecase

字元類和文字字串在匹配的時候不區分大小寫。舉個例子,正規表示式 [a-z] 也將會匹配對應的小寫字母,像 fishc 可以匹配 fishc,fishc 或 fishc 等。如果你不設定 locale,則不會考慮語言(區域)設定這方面的大小寫問題。

llocale

使得 \w,\w,\b 和 \b 依賴當前的語言(區域)環境,而不是 unicode 資料庫。

區域設定是 c 語言的乙個功能,主要作用是消除不同語言之間的差異。例如你正在處理的是法文文字,你想使用 \w+ 來匹配單詞,但是 \w 只是匹配 [a-za-z] 中的單詞,並不會匹配 'é' 或 'ç'。如果你的系統正確的設定了法語區域環境,那麼 c 語言的函式就會告訴程式 'é' 或 'ç' 也應該被認為是乙個字元。當編譯正規表示式的時候設定了 locale 的標誌,\w+ 就可以識別法文了,但速度多少會受到影響。

mmultiline

(^ 和 $ 我們還沒有提到,別著急,後邊我們有細講...)

通常 ^ 只匹配字串的開頭,而 $ 則匹配字串的結尾。當這個標誌被設定的時候,^ 不僅匹配字串的開頭,還匹配每一行的行首;& 不僅匹配字串的結尾,還匹配每一行的行尾。

xverbose

這個標誌使你的正規表示式可以寫得更好看和更有條理,因為使用了這個標誌,空格會被忽略(除了出現在字元類中和使用反斜槓轉義的空格);這個標誌同時允許你在正規表示式字串中使用注釋,# 符號後邊的內容是注釋,不會遞交給匹配引擎(除了出現在字元類中和使用反斜槓轉義的 #)。

下邊是使用 re.verbose 的例子,大家看下正規表示式的可讀性是不是提高了不少:

charref = re.

compile

(r"""

&[#] # 開始數字引用

( 0[0-7]+ # 八進位制格式

| [0-9]+ # 十進位制格式

| x[0-9a-fa-f]+ # 十六進製制格式

); # 結尾分號

""", re.verbose)

如果沒有設定 verbose 標誌,那麼同樣的正規表示式會寫成:

charref = re.compile("&#(0[0-7]+|[0-9]+|x[0-9a-fa-f]+);")

(未完待續)

Python3 如何優雅地使用正規表示式(詳解五)

非捕獲組命名組 精心設計的正規表示式可能會劃分很多組,這些組不僅可以匹配相關的子串,還能夠對正規表示式本身進行分組和結構化。在複雜的正規表示式中,由於有太多的組,因此通過組的序號來跟蹤和使用會變得困難。有兩個新的功能可以幫你解決這個問題 非捕獲組和命名組 它們都使用了乙個公共的正規表示式擴充套件語法...

Python3 如何優雅地使用正規表示式(詳解六)

修改字串 我們已經介紹完如何對字元進行搜尋,接下來我們講講正規表示式如何修改字串。正規表示式使用以下方法修改字串 方法用途 split 在正規表示式匹配的地方進行分割,並返回乙個列表 sub 找到所有匹配的子字串,並替換為新的內容 subn 跟 sub 幹一樣的勾當,但返回新的字串以及替換的數目 分...

Python3 如何優雅地使用正規表示式(詳解二)

現在我們開始來寫一些簡單的正規表示式吧。python 通過 re 模組為正規表示式引擎提供乙個介面,同時允許你將正規表示式編譯成模式物件,並用它們來進行匹配。解釋 re 模組是使用 c 語言編寫,所以效率比你用普通的字串方法要高得多 將正規表示式進行編譯 compile 也是為了進一步提高效率 後邊...