標籤:
什麼是Regex
Regex是一個特殊的字元序列,它能協助你方便的檢查一個字串是否與某種模式比對。最簡單的Regex就是一般字元串,可以匹配其自身。換包話說,Regex’python’ 可以匹配字串’python’ 。你可以用這種匹配行為搜尋文本中的模式,並且用計算後有值並發特定模式,或都將文本進行分段。
萬用字元
Regex可以匹配多於一個的字串,你可以使用一些特殊字元建立這類模式。比如點號(.)可以匹配任何字元。在我們用window 搜尋時用問號(?)匹配任意一位字元,作用是一樣的。那麼這類符號就叫 萬用字元。
對特殊字元進行轉義
通過上面的方法,假如我們要匹配“python.org”,直接用用‘python.org’可以嗎?這麼做可以,但這樣也會匹配“pythonzorg”,這可不是所期望的結果。
好吧!我們需要對它進行轉義,可以在它前面加上發斜線。因此,本例中可以使用“python\\.org”,這樣就只會匹配“python.org”了。
為什麼使用兩個反斜線?
這是為了通過解譯器進行轉義,需要進行兩個層級的轉義:1.通過解譯器的轉義;2.通過 re 模組轉義。如果不想使用兩個反斜線,可以考慮使用原始字串,如:r‘python\.org‘。
字元集
我們可以使用中括弧([ ])括住字串來建立字元集。可以使用範圍,比如‘[a-z]’能夠匹配a到z的任意一個字元,還可以通過一個接一個的方式將範圍聯合起來使用,比如‘[a-zA-Z0-9]’能夠匹配任意大小寫字母和數字。
反轉字元集,可以在開頭使用^字元,比如‘[^abc]’可以匹配任何除了a、b、c之外的字元。
選擇項
有時候只想匹配字串’python’ 和 ’perl’ ,可以使用選擇項的特殊字元:管道符號(|) 。因此, 所需模式可以寫成’python|perl’ 。
子模式
但是,有些時候不需要對整個模式使用選擇符---只是模式的一部分。這時可以使用圓括弧起需要的部分,或稱子模式。 前例可以寫成 ‘p(ython | erl)’
可選項和重複子模式
在子模式後面加上問號,它就變成了可選項。它可能出現在匹配字串,但並非必須的。
r’(heep://)?(www\.)?python\.org’
只能匹配下列字元:
‘http://www.python.org’
‘http://python.org’
‘www.python.org’
‘python.org’
(pattern)* : 允許模式重複0次或多次
(pattern)+ : 允許模式重複1次或多次
(pattern){m,n} : 允許模式重複m~ n 次
例如:
r’w * \.python\.org’ 匹配 ‘www.python.org’ 、’.python.org’ 、’wwwwwww.python.org’
r’w + \.python\.org’ 匹配 ‘w.python.org’ ;但不能匹配 ’.python.org’
r’w {3,4}\.python\.org’ 只能匹配‘www.python.org’ 和‘wwww.python.org’
字串的開始和結尾
使用 ^ 脫字元標記字串開始;使用貨幣符號 $ 標識字串的結尾
>>> ‘^python$‘
re模組
re 模組包含了很多操作Regex的函數,以下是其中最常用的函數:
1 compile(pattern[, flags]) 根據包含Regex的字串建立模式對象
2 search(pattern, string[, flags]) 在字串中尋找模式
3 match(pattern, string[, flags]) 在字串的開始處匹配模式
4 split(pattern, string[, maxsplit=0]) 根據模式的匹配項來分割字串
5 findall(pattern, string) 列出字串中模式的所有匹配項
6 sub(pat, repl, string[, count=0]) 將字串中所有pat的匹配項用repl替換
7 escape(string) 將字串中所有特殊Regex字元轉義
(pattern:匹配的Regex;string:要匹配的字串;flags:標誌位,用於控制Regex的匹配方式,如:是否區分大小寫,多行匹配等等)
re.compile
將Regex轉換為模式對象,可以實現更有效率的匹配。
re.search 會在給定字串中尋找第一個匹配給正則表式的子字串。找到函數返回MatchObject(值為True),否則返回None(值為False) 。因為傳回值的性質,所以該函數可以用在條件陳述式中:
if re.serch(pat, string):
print ‘found it !’
re.match
會在給定字串的開頭匹配Regex。因此,re.match(‘p’ , ‘python’)返回真,re.macth(‘p’ , ‘www.python’) 則返回假。
re.match和re.search的區別
re.match只匹配字串的開始,如果字串開始不符合Regex,則匹配失敗,函數返回None;而re.search匹配整個字串,直到找到一個匹配。
import reline = "Cats are smarter than dogs";matchObj = re.match( r‘dogs‘, line, re.M|re.I)if matchObj: print "match --> matchObj.group() : ", matchObj.group()else: print "No match!!"matchObj = re.search( r‘dogs‘, line, re.M|re.I)if matchObj: print "search --> matchObj.group() : ", matchObj.group()else: print "No match!!"
運行結果:
No match!!search --> matchObj.group() : dogs>>>
re.split
會根據模式的匹配項來分割字串。
>>> import re>>> some_text=‘alpha,beta,,,,,gamma delta‘>>> re.split(‘[, ]+‘,some_text)[‘alpha‘, ‘beta‘, ‘gamma‘, ‘delta‘]>>>
從上述例子看,傳回值是子字串的列表。maxsplit參數表示字串最多可以分割的部分數
>>> re.split(‘[, ]+‘,some_text,maxsplit=2)[‘alpha‘, ‘beta‘, ‘gamma delta‘]>>> re.split(‘[, ]+‘,some_text,maxsplit=1)[‘alpha‘, ‘beta,,,,,gamma delta‘]>>>
re.findall函數
以列表形式返回給定模式的所有匹配項
在字串中尋找所有的單詞
>>> pat=‘[a-zA-Z]+‘>>> text="‘Hm...Err-- are you sure?‘ he said ,sounding insecure.">>> re.findall(pat,text)[‘Hm‘, ‘Err‘, ‘are‘, ‘you‘, ‘sure‘, ‘he‘, ‘said‘, ‘sounding‘, ‘insecure‘]
尋找標點符號
>>> pat=r‘[.?\-",]+‘>>> re.findall(pat,text)[‘...‘, ‘--‘, ‘?‘, ‘,‘, ‘.‘]
re.sub函數
用於替換字串中的匹配項。
re.sub(pattern, repl, string[,count=0])
返回的字串是在字串中用 RE 最左邊不重複的匹配來替換。如果模式沒有發現,字元將被沒有改變地返回。
選擇性參數 count 是模式比對後替換的最大次數;count 必須是非負整數。預設值是 0 表示替換所有的匹配
>>> import re>>> pat=‘{name}‘>>> text=‘Dear {name}‘>>> re.sub(pat,‘Mr.Gumby‘,text)‘Dear Mr.Gumby‘>>> re.escape函數
是可以對字串中所有可能被解釋為正則運算子的字元進行轉義的應用函數。
>>> re.escape(‘www.python.org‘)‘www\\.python\\.org‘>>> re.escape(‘But where is the ambiguity‘)‘But\\ where\\ is\\ the\\ ambiguity‘>>>
匹配對象和組
簡單來說,組就是放置在圓括弧裡內的子模組,組的序號取決於它左側的括弧數。組0就是整個模組,所以在下面的模式中:
‘There (was a (wee) (cooper)) who (lived in Fyfe)‘
包含下面這些組:
0 There was a wee cooper who lived in Fyfe1 was a wee cooper2 wee3 cooper4 lived in Fyfe
re 匹配對象的重要方法
>>> m=re.match(r‘www\.(.*)\..{3}‘,‘www.python.org‘)>>> m.group(1)‘python‘>>> m.start(1)4>>> m.end(1)10>>> m.span(1)(4, 10)>>>
group方法返回模式中與給定組匹配的字串,如果沒有組號,預設為0 ;如上面:m.group()==m.group(0) ;如果給定一個組號,會返回單個字串。
start 方法返回給定組匹配項的開始索引,
end方法返回給定組匹配項的結束索引加1;
span以元組(start,end)的形式返回給組的開始和結束位置的索引。
Regex修飾符--可選標誌
Regex可以包含一些可選標誌修飾符來控制匹配的模式。修飾符被指定為一個可選的標誌。多個標誌可以通過按位 OR(|) 它們來指定。如 re.I | re.M 被設定成 I 和 M 標誌:
| e.I |
使匹配對大小寫不敏感 |
| re.L |
做本地化識別(locale-aware)匹配 |
| re.M |
多行匹配,影響 ^ 和 $ |
| re.S |
使 . 匹配包括換行在內的所有字元 |
| re.U |
根據Unicode字元集解析字元。這個標誌影響 \w, \W, \b, \B. |
| re.X |
該標誌通過給予你更靈活的格式以便你將Regex寫得更易於理解。 |
Regex模式
| 模式 |
描述 |
| ^ |
匹配字串的開頭 |
| $ |
匹配字串的末尾。 |
| . |
匹配任一字元,除了分行符號,當re.DOTALL標記被指定時,則可以匹配包括分行符號的任一字元。 |
| [...] |
用來表示一組字元,單獨列出:[amk] 匹配 ‘a‘,‘m‘或‘k‘ |
| [^...] |
不在[]中的字元:[^abc] 匹配除了a,b,c之外的字元。 |
| re* |
匹配0個或多個的運算式。 |
| re+ |
匹配1個或多個的運算式。 |
| re? |
匹配0個或1個由前面的Regex定義的片段,非貪婪方式 |
| re{ n} |
|
| re{ n,} |
精確匹配n個前面運算式。 |
| re{ n, m} |
匹配 n 到 m 次由前面的Regex定義的片段,貪婪方式 |
| a| b |
匹配a或b |
| (re) |
G匹配括弧內的運算式,也表示一個組 |
| (?imx) |
Regex包含三種可選標誌:i, m, 或 x 。隻影響括弧中的地區。 |
| (?-imx) |
Regex關閉 i, m, 或 x 可選標誌。隻影響括弧中的地區。 |
| (?: re) |
類似 (...), 但是不表示一個組 |
| (?imx: re) |
在括弧中使用i, m, 或 x 可選標誌 |
| (?-imx: re) |
在括弧中不使用i, m, 或 x 可選標誌 |
| (?#...) |
注釋. |
| (?= re) |
前向肯定界定符。如果所含Regex,以 ... 表示,在當前位置成功匹配時成功,否則失敗。但一旦所含運算式已經嘗試,匹配引擎根本沒有提高;模式的剩餘部分還要嘗試界定符的右邊。 |
| (?! re) |
前向否定界定符。與肯定界定符相反;當所含運算式不能在字串當前位置匹配時成功 |
| (?> re) |
匹配的獨立模式,省去回溯。 |
| \w |
匹配字母數字 |
| \W |
匹配非字母數字 |
| \s |
匹配任意空白字元,等價於 [\t\n\r\f]. |
| \S |
匹配任意非Null 字元 |
| \d |
匹配任一數字,等價於 [0-9]. |
| \D |
匹配任意非數字 |
| \A |
匹配字串開始 |
| \Z |
匹配字串結束,如果是存在換行,只匹配到換行前的結束字串。c |
| \z |
匹配字串結束 |
| \G |
匹配最後匹配完成的位置。 |
| \b |
匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, ‘er\b‘ 可以匹配"never" 中的 ‘er‘,但不能匹配 "verb" 中的 ‘er‘。 |
| \B |
匹配非單詞邊界。‘er\B‘ 能匹配 "verb" 中的 ‘er‘,但不能匹配 "never" 中的 ‘er‘。 |
| \n, \t, 等. |
匹配一個分行符號。匹配一個定位字元。等 |
| \1...\9 |
匹配第n個分組的子運算式。 |
| \10 |
匹配第n個分組的子運算式,如果它經匹配。否則指的是八進位字元碼的運算式。 |
Regex執行個體 字元類
| 執行個體 |
描述 |
| [Pp]ython |
匹配 "Python" 或 "python" |
| rub[ye] |
匹配 "ruby" 或 "rube" |
| [aeiou] |
匹配中括弧內的任意一個字母 |
| [0-9] |
匹配任何數字。類似於 [0123456789] |
| [a-z] |
匹配任何小寫字母 |
| [A-Z] |
匹配任何大寫字母 |
| [a-zA-Z0-9] |
匹配任何字母及數字 |
| [^aeiou] |
除了aeiou字母以外的所有字元 |
| [^0-9] |
匹配除了數字外的字元 |
特殊字元類
| 執行個體 |
描述 |
| . |
匹配除 "\n" 之外的任何單個字元。要匹配包括 ‘\n‘ 在內的任何字元,請使用象 ‘[.\n]‘ 的模式。 |
| \d |
匹配一個數字字元。等價於 [0-9]。 |
| \D |
匹配一個非數字字元。等價於 [^0-9]。 |
| \s |
匹配任何空白字元,包括空格、定位字元、換頁符等等。等價於 [ \f\n\r\t\v]。 |
| \S |
匹配任何非空白字元。等價於 [^ \f\n\r\t\v]。 |
| \w |
匹配包括底線的任何單詞字元。等價於‘[A-Za-z0-9_]‘。 |
| \W |
匹配任何非單詞字元。等價於 ‘[^A-Za-z0-9_]‘。 |
python學習筆記(Regex)