正規表達式
(?pgroup)這個正則的意思是,給比對到的數字命名一個組名name,這個組名必須是唯一的。
另一種是正則比對使用group(組名)可以擷取到這個組名下的資料,同group(1),group(2)類似
eg:
(?p\d{2})比對帶有兩個數字的
**正規表達式模式:** 模式字元串使用特殊的文法來表示一個正規表達式: 字母和數字表示他們自身。一個正規表達式模式中的字母和數字比對同樣的字元串。 多數字母和數字前加一個反斜杠時會擁有不同的含義。 标點符号隻有被轉義時才比對自身,否則它們表示特殊的含義。 反斜杠本身需要使用反斜杠轉義。 由于正規表達式通常都包含反斜杠,是以你最好使用原始字元串來表示它們。模式元素(如 r'\t',等價于 '\\t')比對相應的特殊字元。 下表列出了正規表達式模式文法中的特殊元素。如果你使用模式的同時提供了可選的标志參數,某些模式元素的含義會改變。 ``` 模式 描述 ^ 比對字元串的開頭 $ 比對字元串的末尾。 . 比對任意字元,除了換行符,當re.DOTALL标記被指定時,則可以比對包括換行符的任意字元。 [...] 用來表示一組字元,單獨列出:[amk] 比對 'a','m'或'k' [^...] 不在[]中的字元:[^abc] 比對除了a,b,c之外的字元。 * 比對0個或多個的表達式。 + 比對1個或多個的表達式。 ? 比對0個或1個由前面的正規表達式定義的片段,非貪婪方式 { n} 精确比對 n 個前面表達式。例如, o{2} 不能比對 "Bob" 中的 "o",但是能比對 "food" 中的兩個 o。 { n,} 比對 n 個前面表達式。例如, o{2,} 不能比對"Bob"中的"o",但能比對 "foooood"中的所有 o。"o{1,}" 等價于 "o+"。"o{0,}" 則等價于 "o*"。 { n, m} 比對 n 到 m 次由前面的正規表達式定義的片段,貪婪方式 a| b 比對a或b () 比對括号内的表達式,也表示一個組 (?imx) 正規表達式包含三種可選标志:i, m, 或 x 。隻影響括号中的區域。 (?-imx) 正規表達式關閉 i, m, 或 x 可選标志。隻影響括号中的區域。 (?: re) 類似 (...), 但是不表示一個組 (?imx: re) 在括号中使用i, m, 或 x 可選标志 (?-imx: re) 在括号中不使用i, m, 或 x 可選标志 (?#...) 注釋. (?= re) 前向肯定界定符。如果所含正規表達式,以 ... 表示,在目前位置成功比對時成功,否則失敗。但一旦所含表達式已經嘗試,比對引擎根本沒有提高;模式的剩餘部分還要嘗試界定符的右邊。 (?! re) 前向否定界定符。與肯定界定符相反;當所含表達式不能在字元串目前位置比對時成功 (?> re) 比對的獨立模式,省去回溯。 \w 比對字母數字及下劃線 \W 比對非字母數字及下劃線 \s 比對任意空白字元,等價于 [\t\n\r\f]. \S 比對任意非空字元 \d 比對任意數字,等價于 [0-9]. \D 比對任意非數字 \A 比對字元串開始 \Z 比對字元串結束,如果是存在換行,隻比對到換行前的結束字元串。 \z 比對字元串結束 \G 比對最後比對完成的位置。 \b 比對一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以比對"never" 中的 'er',但不能比對 "verb" 中的 'er'。 \B 比對非單詞邊界。'er\B' 能比對 "verb" 中的 'er',但不能比對 "never" 中的 'er'。 \n, \t, 等. 比對一個換行符。比對一個制表符。等 \1...\9 比對第n個分組的内容。 \10 比對第n個分組的内容,如果它經比對。否則指的是八進制字元碼的表達式。
<br>
正規表達式相關的比對的函數
re.match():從開頭開始比對,比對不到傳回None
re.findall:比對所有
re.finditer:比對所有得到的是一個疊代器
re.search:從任何位置都可以比對,比對到一個
在上面,當比對成功時傳回一個 Match/findall/findall/search/ 對象,其中:
group([group1, …]) 方法用于獲得一個或多個分組比對的字元串,當要獲得整個比對的子串時,可直接使用 group() 或 group(0);
start([group]) 方法用于擷取分組比對的子串在整個字元串中的起始位置(子串第一個字元的索引),參數預設值為 0;
end([group]) 方法用于擷取分組比對的子串在整個字元串中的結束位置(子串最後一個字元的索引+1),參數預設值為 0;
span([group]) 方法傳回 (start(group), end(group))。
<br>
代碼顯示的demo:
demo1:
import re
pattern = re.compile(r’([a-z]+) ([a-z]+)’, re.I) # re.I 表示忽略大小寫
m = pattern.match(‘Hello World Wide Web’)
print m # 比對成功,傳回一個 Match 對象
<_sre.SRE_Match object at 0x10bea83e8>
m.group(0) # 傳回比對成功的整個子串
‘Hello World’
m.span(0) # 傳回比對成功的整個子串的索引
(0, 11)
m.group(1) # 傳回第一個分組比對成功的子串
‘Hello’
m.span(1) # 傳回第一個分組比對成功的子串的索引
(0, 5)
m.group(2) # 傳回第二個分組比對成功的子串
‘World’
m.span(2) # 傳回第二個分組比對成功的子串
(6, 11)
m.groups() # 等價于 (m.group(1), m.group(2), …)
(‘Hello’, ‘World’)
m.group(3) # 不存在第三個分組
Traceback (most recent call last):
File “”, line 1, in
IndexError: no such group
<br>
demo2:
-- coding:utf-8 --
import re
pattern = re.compile(r"\d+")
m = pattern.finditer(“12kdjf334dfjl88”)
for i in m:
print(i.group())
s = re.search(“www”, “www.baidu.com”).group()
# group() 傳回的是比對的字元
# span() 傳回的是一個元組(star,end)
# start() # 傳回的是一個比對字元的開始的位置
# end() # 傳回的是比對到的字元的結束的位置
print(s)
<br>
通常用到的一些簡單的例子:
正規表達式比對手機号,郵箱,身份證号
手機号:
^1[3-8][0-9]{9}$
<br>
郵箱:
^\w+([.]\w+)?[@]\w+[.]\w+([.]\w+)?$
<br>
身份證号:
1[0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|31)|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}([0-9]|x|X)$
1)6位地區号:首位非0,後五位數字。對應正則:[1-9][0-9]{5}
2)4位年:19或20開頭,後兩位數字。對應正則:(19|20)[0-9]{2}
3)4位月日:
i)大月31天。對應正則:(01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|31)
ii)小月30天。對應正則:(04|06|09|11)(0[1-9]|[1-2][0-9]|30)
iii)2月28天或29天。對應正則:02(0[1-9]|[1-2][0-9])
4)3位編号:三位數字。對應正則:[0-9]{3}
5)1位新生成編号:數字或x。對應正則:([0-9]|x|X)
- 1-9 ↩︎