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模組的講解很簡單易懂,內容不多但起碼把人領進門了,...