python正規表示式

2022-02-24 11:14:09 字數 4326 閱讀 7054

python使用正規表示式之前需要先倒入re模組

import re

可選標誌位

re.a

ascii,使得\w,\w,\b,\b,\s 和

\s 只匹配 ascii

字元,而不匹配完整的

unicode

字元。這個標誌僅對

unicode

模式有意義,並忽略位元組模式。

re.i

ignorecase,字元類和文字字串在匹配的時候不區分大小寫

re.l

locale,使得\w,\w

,\b 

和\b 

依賴當前的語言(區域)環境,而不是

unicode

資料庫re.m

multiline,通常^ 

只匹配字串的開頭,而

$ 則匹配字串的結尾。當這個標誌被設定的時候,

^ 不僅匹配字串的開頭,還匹配每一行的行首;

& 不僅匹配字串的結尾,還匹配每一行的行尾。

re.s

dotall,使 . 匹配包括換行符在內的所有字元

re.x

verbose,這個標誌使你的正規表示式可以寫得更好看和更有條理,因為使用了這個標誌,空格會被忽略(除了出現在字元類中和使用反斜槓轉義的空格);這個標誌同時允許你在正規表示式字串中使用注釋,# 

符號後邊的內容是注釋,不會遞交給匹配引擎(除了出現在字元類中和使用反斜槓轉義的#)。

可以同時使用多個標誌位,方法:re.search(r'正規表示式', '字串', re.m|re.i)

特殊字元

\d匹配任何十進位制數字;相當於類[0-9]

\d與\d 

相反,匹配任何非十進位制數字的字元;相當於類

[^0-9]

\s匹配任何空白字元(包含空格、換行符、製表符等);相當於[ \t\n\r\f\v]

\s匹配任何非空白字元;相當於類

[^\t\n\r\f\v]

\w匹配字母數字及下劃線

\w匹配非字母數字及下劃線

\b匹配單詞的開始或結束

\b匹配非單詞邊界

元字元

或操作符,a | b匹配a或b

匹配字串的開頭,如果設定了 multiline 標誌,就會變成匹配每一行的起始位置。

匹配字串的末尾。如果設定了 multiline 標誌,就會變成匹配每一行的結束位置。

匹配任意單個字元,除了換行符,如果設定了dotall標誌,則可以匹配包括換行符的任意字元。

[abc]

匹配括號中的a,b,c任意單個字元,而不是abc字串

[^abc]

匹配除了a,b,c

之外的任意字元

匹配前乙個字元0次或多次

匹配前乙個字元1次或多次

匹配前乙個字元0次或1次

精確匹配前乙個字元 n次,例如ab,可以匹配aaab

匹配前乙個字元0次到n次

匹配前乙個字元 n次到無限次

匹配前乙個字元 m 到 n 次

\1...\9

匹配第n個分組的內容。(abc)小括號括起來的為一組\1匹配第乙個小括號的組...

1.compile函式:用於編譯正規表示式,生成乙個正規表示式物件

p = re.compile(r'正規表示式'[, 可選標誌位])

p.search('待匹配內容').group()

2.match函式:從字串的起始位置開始匹配,如果起始位置匹配不成功返回none

re.match(r'正規表示式','字串'[,可選標誌位])

匹配物件包含了很多方法和屬性,以下幾個是最重要的

group()

返回匹配的字串

start()

返回匹配的開始位置

end()

返回匹配的結束位置

span()

返回乙個元組表示匹配位置(開始,結束)

3.search函式:掃瞄整個字串並返回第乙個成功匹配的子串

re.search(r'正規表示式','字串'[,可選標誌位])

匹配物件同樣包含了很多方法和屬性

group()

返回匹配的字串

start()

返回匹配的開始位置

end()

返回匹配的結束位置

span()

返回乙個元組表示匹配位置(開始,結束)

4.findall函式:掃瞄整個字串,並返回乙個列表,所有成功匹配的子串,如果沒有匹配成功返回none

r = re.findall('\d+','111aaa222bbb333ccc')

print(r)

['111', '222', '333']

#當正規表示式加上括號時,返回結果會優先顯示括號內匹配到的內容

#如果不想要優先顯示括號內匹配到的內容,可以在括號內頂格加上?:

#(?:正規表示式)

5.finditer函式:和findall類似,成功匹配時返回乙個迭代器

p = re.compile('\d+')

iterator = p.finditer('3只小甲魚,15條腿,還有3條去了**?')

for match in iterator:

print (match.group())

6.sub函式:替換,類似字串的replace

>>> r = re.sub('\d+', 'b', 'aaa111aaa222aaa333')

>>> print(r)

aaabaaabaaab

7.split函式:切割

>>> r = re.split('\d+','111aaa222bbb333ccc') 

>>> print(r)

['', 'aaa', 'bbb', 'ccc']

#可以加上切割次數

>>> r = re.split('\d+','111aaa222bbb333ccc',1)

>>> print(r)

['', 'aaa222bbb333ccc']

#當需要顯示切割的內容時,可以在正規表示式兩邊加上括號

#列印時會把切割的內容一併顯示

>>> r = re.split('(\d+)','111aaa222bbb333ccc')

>>> print(r)

['', '111', 'aaa', '222', 'bbb', '333', 'ccc']

8.分組命名

定義分組:(?p正規表示式)

分組引用:(?p=name)

>>> r = re.search('(?p<\w+>)(?p\w+)(?p=tag)','haha')

>>> print(r.group("t"))

haha

>>> print(r.group("tag"))

貪婪 vs 非貪婪

當重複乙個正規表示式時,如果使用 a*,那麼結果是盡可能多地去匹配。當你嘗試匹配一對對稱的定界符,例如 html 標誌中的尖括號,預設的貪婪模式會使得你很困擾。

我們來看下例子:

>>> s = 'title'

>>> len(s)

32>>> print(re.match('<.*>', s).span())

(0, 32)

>>> print(re.match('<.*>', s).group())

title

re 匹配在 的 < 後,.* 消耗掉字串的剩餘部分。由於正規表示式預設是貪婪的原因,re 必須從字串的尾部乙個字元乙個字元地回溯,直到找到匹配的 >。大家看到,按照這種方法,最後找到匹配內容竟是 的 < 開始,到 的 > 結束。顯然這不是你想要的結果。

在這種情況下,解決方案是使用非貪婪的限定符 *?、+?、?? 或 ?,盡可能地匹配小的文字。

>>> print(re.match('<.*?>', s).group())

python正規表示式元字元 正規表示式

字元 描述將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了 regexp 物件的 multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束...

Python 正規表示式

1.在python中,所有和正規表示式相關的功能都包含在re模組中。2.字元 表示 字串的末尾 如 road 則表示 只有當 road 出現在乙個字串的尾部時才會匹配。3.字元 表示 字元中的開始 如 road 則表示 只有當 road 出現在乙個字串的頭部時才會匹配。4.利用re.sub函式對字串...

Python正規表示式

學習python自然而然就不得不面對正規表示式這個難題。當初在沒有學習python之前,自己也曾經嘗試著學習過正規表示式,但是那時候感覺很麻煩,很難懂,結果就是不了了之。但是現在學習python我用的書是 python基礎教程 第二版 這本書中對re模組的講解很簡單易懂,內容不多但起碼把人領進門了,...