python 正則表達式re庫相關筆記
匹配(試圖在字符串的開始位置進行匹配) 搜索(試圖從字符串的任何位置開始匹配)
正則表達式中的特殊符號和字符,即所謂的元字符,給予了正則表達式強大的功能和靈活性
常見正則表達式符號和特殊字符
表 示 法 | 描 述 | 正則表達式示例 |
符號 | ||
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} | 匹配 M~N 次前面出現的正則表達式 | [0-9]{5,9} |
[…] | 匹配來自字符集的任意單一字符 | [aeiou] |
[..x-y..] |
匹配 x~y 範圍中的任意單一字符 | [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(pattern, string, max=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庫相關筆記