Python之re模組 正規表示式操作

2021-07-22 04:19:31 字數 4047 閱讀 8923

這個模組提供了與 perl 相似l的正規表示式匹配操作。unicode字串也同樣適用。

正規表示式使用反斜槓" \ "來代表特殊形式或用作轉義字元,這裡跟python的語法衝突,因此,python用" \\\\ "表示正規表示式中的" \ ",因為正規表示式中如果要匹配" \ ",需要用\來轉義,變成" \\ ",而python語法中又需要對字串中每乙個\進行轉義,所以就變成了" \\\\ "。

上面的寫法是不是覺得很麻煩,為了使正規表示式具有更好的可讀性,python特別設計了原始字串(raw string),需要提醒你的是,在寫檔案路徑的時候就不要使用raw string了,這裡存在陷阱。raw string就是用'r'作為字串的字首,如 r"\n":表示兩個字元"\"和"n",而不是換行符了。python中寫正規表示式時推薦使用這種形式。

絕大多數正規表示式操作與 模組級函式或regexobject方法 一樣都能達到同樣的目的。而且不需要你一開始就編譯正規表示式物件,但是不能使用一些實用的微調引數。

1.正規表示式語法

為了節省篇幅,這裡不再敘述了。

2.martch和search的區別

python提供了兩種不同的原始操作:match和search。match是從字串的起點開始做匹配,而search(perl預設)是從字串做任意匹配。

注意:當正規表示式是' ^ '開頭時,match與search是相同的。match只有當且僅當被匹配的字串開頭就能匹配 或 從pos引數的位置開始就能匹配 時才會成功。如下:

>>> import re

>>> re.match("c", "abcdef")

>>> re.search("c","abcdef")

<_sre.sre_match object at 0x00a9a988>

>>> re.match("c", "cabcdef")

<_sre.sre_match object at 0x00a9ab80>

>>> re.search("c","cabcdef")

<_sre.sre_match object at 0x00af1720>

>>> patterm = re.compile("c")

>>> patterm.match("abcdef")

>>> patterm.match("abcdef",1)

>>> patterm.match("abcdef",2)

<_sre.sre_match object at 0x00a9ab80>

3.模組內容編譯正規表示式,返回regexobject物件,然後可以通過regexobject物件呼叫match()和search()方法。

prog = re.compile(pattern)

result = prog.match(string)

跟result = re.match(pattern, string)

是等價的。

第一種方式能實現正規表示式的重用。

在字串中查詢,是否能匹配正規表示式。返回_sre.sre_match物件,如果不能匹配返回none。

字串的開頭是否能匹配正規表示式。返回_sre.sre_match物件,如果不能匹配返回none。

通過正規表示式將字串分離。如果用括號將正規表示式括起來,那麼匹配的字串也會被列入到list中返回。maxsplit是分離的次數,maxsplit=1分離一次,預設為0,不限制次數。

>>> re.split('\w+', 'words, words, words.')

['words', 'words', 'words', '']

>>> re.split('(\w+)', 'words, words, words.')

['words', ', ', 'words', ', ', 'words', '.', '']

>>> re.split('\w+', 'words, words, words.', 1)

['words', 'words, words.']

>>> re.split('[a-f]+', '0a3b9', flags=re.ignorecase)

注意:我使用的python是2.6,檢視源**發現split()並沒有flags的引數,2.7才增加。這種問題我發現不止一次了,官方的文件 跟 原始碼不一致的現象,如果發現異常,應該去原始碼中找找原因。

如果在字串的開始或結尾就匹配,返回的list將會以空串開始或結尾。

>>> re.split('(\w+)', '...words, words...')

['', '...', 'words', ', ', 'words', '...', '']

如果字串不能匹配,將會返回整個字串的list。

>>> re.split("a","bbb")

['bbb']

找到 re 匹配的所有子串,並把它們作為乙個列表返回。這個匹配是從左到右有序地返回。如果無匹配,返回空列表。

>>> re.findall("a","bcdef")

>>> re.findall(r"\d+","12a32bc43jf3")

['12', '32', '43', '3']

找到 re 匹配的所有子串,並把它們作為乙個迭代器返回。這個匹配是從左到右有序地返回。如果無匹配,返回空列表。

>>> it = re.finditer(r"\d+","12a32bc43jf3")

>>> for match in it:

print match.group()

12 32

43 3

找到 re 匹配的所有子串,並將其用乙個不同的字串替換。可選引數 count 是模式匹配後替換的最大次數;count 必須是非負整數。預設值是 0 表示替換所有的匹配。如果無匹配,字串將會無改變地返回。

與re.sub方法作用一樣,但返回的是包含新字串和替換執行次數的兩元組。

對字串中的非字母數字進行轉義

清空快取中的正規表示式

4.正規表示式物件re.compile()返回regexobject物件

group()返回被 re 匹配的字串

start()返回匹配開始的位置

end()返回匹配結束的位置

span()返回乙個元組包含匹配 (開始,結束) 的位置

5.編譯標誌

編譯標誌讓你可以修改正規表示式的一些執行方式。在 re 模組中標誌可以使用兩個名字,乙個是全名如 ignorecase,乙個是縮寫,一字母形式如 i。(如果你熟悉 perl 的模式修改,一字母形式使用同樣的字母;例如 re.verbose的縮寫形式是 re.x。)多個標誌可以通過按位 or-ing 它們來指定。如 re.i | re.m 被設定成 i 和 m 標誌:

i

ignorecase

使匹配對大小寫不敏感;字元類和字串匹配字母時忽略大小寫。舉個例子,[a-z]也可以匹配小寫字母,spam 可以匹配 "spam", "spam", 或 "spam"。這個小寫字母並不考慮當前位置。

l

locale

影響 "w, "w, "b, 和 "b,這取決於當前的本地化設定。

m

multiline

(此時 ^ 和 $ 不會被解釋; 它們將在 4.1 節被介紹.)

使用 "^" 只匹配字串的開始,而 $ 則只匹配字串的結尾和直接在換行前(如果有的話)的字串結尾。當本標誌指定後, "^" 匹配字串的開始和字串中每行的開始。同樣的, $ 元字元匹配字串結尾和字串中每行的結尾(直接在每個換行之前)。

s

dotall

使 "." 特殊字元完全匹配任何字元,包括換行;沒有這個標誌, "." 匹配除了換行外的任何字元。

x

verbose

該標誌通過給予你更靈活的格式以便你將正規表示式寫得更易於理解。當該標誌被指定時,在 re 字串中的空白符被忽略,除非該空白符在字元類中或在反斜槓之後;這可以讓你更清晰地組織和縮排 re。它也可以允許你將注釋寫入 re,這些注釋會被引擎忽略;注釋用 "#"號 來標識,不過該符號不能在字串或反斜槓之後。

python常用模組之re模組(正則)

python種的re模組常用的5種方法,分別是re.match re.search re.findall re.split re.sub。在介紹五種方法之前,需要介紹一下正則的基礎。表示任意字元,除 n以為 轉義字元 字符集,表示取其中任意乙個字元。比如 abc d 可以匹配到ad bd cd。d ...

python常用模組之 正則re模組

python中使用正規表示式的步驟 1.匯入re模組 import re 2.初始化乙個regex物件 re.compile 3.剛剛建立的regex物件呼叫search方法進行匹配,返回要給march物件 4.剛剛的march物件呼叫group方法,展示匹配到的字串 下面例子的知識點 對正規表示式...

Python之re模組正規表示式

re模組用於對python的正規表示式的操作 字元 匹配除換行符以外的任意字元 w匹配字母或數字或下劃線或漢字 s匹配任意空白符 b匹配單詞的開始或結束 匹配字串的開始 匹配字串的結束 次數 重複零次或多次 重複一次或多次 重複零次或者一次 重複n次 重複n次或更多次 重複n到m次 出現一串類似於這...