1. 程式人生 > >python 正則表達式re庫相關筆記

python 正則表達式re庫相關筆記

class 匹配 courier body dfs 語法 元素 正則表達式 normal

匹配(試圖在字符串的開始位置進行匹配) 搜索(試圖從字符串的任何位置開始匹配)

正則表達式中的特殊符號和字符,即所謂的元字符,給予了正則表達式強大的功能和靈活性

常見正則表達式符號和特殊字符

表 示 法 描 述 正則表達式示例
符號
literal 匹配文本字符串的字面值 literal foo
re1|re2 匹配正則表達式 re1 或者 re2 foo|bar
. 匹配任何字符(除了\n 之外) b.b
^ 匹配字符串起始部分 ^Dear
$
匹配字符串終止部分 /bin/*sh$
* 匹配 0 次或者多次前面出現的正則表達式 [A-Za-z0-9]*
+ 匹配 1 次或者多次前面出現的正則表達式 [a-z]+\.com
? 匹配 0 次或者 1 次前面出現的正則表達式 goo?
{N} 匹配 N 次前面出現的正則表達式 [0-9]{3}
{M,N} 匹配 MN 次前面出現的正則表達式 [0-9]{5,9}
[…] 匹配來自字符集的任意單一字符 [aeiou]
[..x-y..]
匹配 xy 範圍中的任意單一字符 [0-9], [A-Za-z]
[^…] 不匹配此字符集中出現的任何一個字符,包括某一範圍的字符(如果在此字符集中出現) [^aeiou], [^A-Za-z0-9]
(*|+|?|{})? 用於匹配上面頻繁出現/重復出現符號的非貪婪版本(*+?{} .*?[a-z]
(…) 匹配封閉的正則表達式,然後另存為子組 ([0-9]{3})?,f(oo|u)bar



表 示 法 描 述 正則表達式示例
特殊字符
\d 匹配任何十進制數字,與[0-9]一致(\D \d 相反,不匹配任何非數值型的數字) data\d+.txt
\w 匹配任何字母數字字符,與[A-Za-z0-9_]相同(\W 與之相反) [A-Za-z_]\w+
\s 匹配任何空格字符,與[\n\t\r\v\f]相同(\S 與之相反) of\sthe
\b 匹配任何單詞邊界(\B 與之相反) \bThe\b
\N 匹配已保存的子組 N(參見上面的(…)) price: \16
\c 逐字匹配任何特殊字符 c(即,僅按照字面意義匹配,不匹配特殊含義) \., \\, \*
\A(\Z) 匹配字符串的起始(結束)(另見上面介紹的^$ \ADear
擴展表示法
(?iLmsux) 在正則表達式中嵌入一個或者多個特殊“標記” 參數(或者通過函數/方法) ?x),(? im
(?:…) 表示一個匹配不用保存的分組 (?:\w+\.)*
(?P<name>…) 像一個僅由 name 標識而不是數字 ID 標識的正則分組匹配 (?P<data>)
(?P=name) 在同一字符串中匹配由(?P<name)分組的之前文本 (?P=data)
(?#…) 表示註釋,所有內容都被忽略 (?#comment)
(?=…) 匹配條件是如果出現在之後的位置,而不使用輸入字符串;稱作正向前視斷言 (?=.com)
(?!…) 匹配條件是如果不出現在之後的位置,而不使用輸入字符串;稱作負向前視斷言 (?!.net)
(?<=…) 匹配條件是如果出現在之前的位置,而不使用輸入字符串;稱作正向後視斷言 (?<=800-)
(?<!…) 匹配條件是如果不出現在之前的位置,而不使用輸入字符串;稱作負向後視斷言 (?<!192\.168\.)
(?(id/name)Y|N ) 如果分組所提供的 id 或者 name(名稱)存在,就返回正則表達式的條件匹配 Y,如
果不存在,就返回 N|N 是可選項
(?(1)y|x)



---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

group方法,可以用來定位我要查找文本中的文本(findall的返回結果是列表,而列表是沒有group方法的)

如果正則表達式pattern裏面有(),表示對數據的分組,括號可以有多個,一個括號一組,按順序從1開始(註意不是0是1),可以對結果使用.(group(num=0)方法索取,可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。沒有分組的話使用.group()會報錯.

.group(0)是打印搜索的結果

.group()返回str類型

想在某個組中不區分大小寫請在組中開頭加上(?i:)

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

re.findall()返回一個列表(無論匹配不匹配)

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

re.search 掃描整個字符串並返回第一個成功的匹配。

函數語法:

re.search(pattern, string, flags=0)

匹配成功re.search方法返回一個匹配的對象(類型是_sre.SRE_Match),否則返回None.

re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

re.split(patternstringmax=0)

將string以pattern為界分解成多個段,按順序存入列表

為什麽out第一個是‘‘呢

In[28]: b = re.split(r"a","abajajodfnadd")
In[29]: b
Out[29]: [‘‘, b, j, jodfn, dd]

列表中第一個元素的意思是a把字符串分割成[0:0]的範圍,顯然這個範圍是沒有任何數據的,驗證如下

In[32]: c = abcsdfs
In[33]: c[0:1]
Out[33]: a
In[34]: c[0:0]
Out[34]: ‘‘

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

"(\d){3}" 這個表達式是要匹配連續的三個數字,但是這個表達式中只有一個小括號,表明只有一個組,每個組中只會有一個數字

"(\d{3})"而這樣寫是一個組中有三個數字!

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

貪婪與費貪婪

data = Thu Feb 15 17:46:04 2007::[email protected]::1171590364-6-8

patt = .+(\d+-\d+-\d+)

re.search(patt, data).group(1)(patt, data).group(1) 

這裏我們本來是想匹配1171590364-6-8的,但是結果卻是4-6-8,這是由於正則表達式中的‘.+‘是貪婪的,匹配了‘Thu Feb 15 17:46:04 2007::[email protected]::117159036‘

,他比(\d+-\d+-\d+)靠前,會盡量匹配最大長度的字符串,但是他不能貪婪的把所有值都匹配上,所以他留給了(\d+-\d+-\d+)一個盡可能小的匹配長度(4-6-8)

想要消除‘.+‘的貪婪在他後面加上?即可

patt = ‘.+?(\d+-\d+-\d+)‘




python 正則表達式re庫相關筆記