標籤:tutorial close 技術 傳回值 迭代器 with developer develop 轉化
摘要
^表示行的開頭,^\d表示必須以數字開頭。
$表示行的結束,\d$表示必須以數字結束。
你可能注意到了,py也可以匹配‘python‘-->py;
但是加上^py$就變成了整行匹配,就只能匹配‘py‘了,匹配‘python‘時,就什麼也得不到。
參考表Regex特殊序列
re模組
re.compile(pattern[, flags])
把Regex的模式和標識轉化成Regex對象,供 match() 和 search() 這兩個函數使用。
re 所定義的 flag 包括:
re.I 忽略大小寫re.L 表示特殊字元集 \w, \W, \b, \B, \s, \S 依賴於當前環境re.M 多行模式re.S 即為’ . ’並且包括分行符號在內的任一字元(’ . ’不包括分行符號)re.U 表示特殊字元集 \w, \W, \b, \B, \d, \D, \s, \S 依賴於 Unicode 字元屬性資料庫re.X 為了增加可讀性,忽略空格和’ # ’後面的注釋
以下兩種用法結果相同:(A)
compiled_pattern = re.compile(pattern) result = compiled_pattern.match(string)
(B)
result = re.match(pattern, string)
s = ‘ABC\\-001‘ # Python的字串 #對應的Regex字串變成: #‘ABC\-001‘
因此我們強烈建議使用Python的r首碼,就不用考慮轉義的問題了
s = r‘ABC\-001‘ # Python的字串# 對應的Regex字串不變:# ‘ABC\-001‘
search
re.search(pattern, string[, flags])`
在字串中尋找匹配Regex模式的位置,返回 MatchObject 的執行個體,如果沒有找到匹配的位置,則返回 None。
對於已編譯的Regex對象來說(re.RegexObject),有以下 search 的方法:
search (string[, pos[, endpos]])
若 regex 是已編譯好的Regex對象,regex.search(string, 0, 50) 等同於 regex.search(string[:50], 0)。
>>> pattern = re.compile("a") >>> pattern.search("abcde") # Match at index 0 >>> pattern.search("abcde", 1) # No match;
match
re.match(pattern, string[, flags])
判斷 pattern 是否在字串開頭位置匹配。對於 RegexObject,有:
match(string[, pos[, endpos]])
match() 函數只在字串的開始位置嘗試匹配Regex,也就是只報告從位置 0 開始的匹配情況,而 search() 函數是掃描整個字串來尋找匹配。如果想要搜尋整個字串來尋找匹配,應當用 search()。
>>> pattern.match(‘bca‘,2).group()‘a‘
雖然,match預設是從開頭匹配,但是,如果指定位置,仍然能成功;但是!match也是從指定位置開始匹配,不匹配仍然會失敗,這一點就和search有區別啦。
match()方法判斷是否匹配,如果匹配成功,返回一個Match對象,否則返回None。
test = ‘使用者輸入的字串‘if re.match(r‘Regex‘, test): print(‘ok‘)else: print(‘failed‘)
split
re.split(pattern, string[, maxsplit=0, flags=0])
此功能很常用,可以將將字串匹配Regex的部分割開並返回一個列表。對 RegexObject,有函數:
split(string[, maxsplit=0])
對於一個找不到匹配的字串而言,split 不會對其作出分割
>>> ‘a b c‘.split(‘ ‘)[‘a‘, ‘b‘, ‘‘, ‘‘, ‘c‘]
這裡用字串內建的split方法就很不靈活。
>>> re.split(r‘\s+‘, ‘a b c‘)[‘a‘, ‘b‘, ‘c‘]
看出差別了吧,很強大!再來一個終極的:
>>> re.split(r‘[\s\,\;]+‘, ‘a,b;; c d‘)[‘a‘, ‘b‘, ‘c‘, ‘d‘]
r‘[\s\,\;]+‘的正則表達式意思為:空格或者,或者;`出現1次或1次以上都是滿足條件的分割符號!所以,最後結果還是很乾淨。
findall
re.findall(pattern, string[, flags])
在字串中找到Regex所匹配的所有子串,並組成一個列表返回。同樣 RegexObject 有:
findall(string[, pos[, endpos]])
#get all content enclosed with [], and return a list >>> pattern=re.compile(r‘hh‘)>>> pattern.findall(‘hhmichaelhh‘)[‘hh‘, ‘hh‘]
finditer
re.finditer(pattern, string[, flags])
和 findall 類似,在字串中找到Regex所匹配的所有子串,並組成一個迭代器返回。同樣 RegexObject有:
finditer(string[, pos[, endpos]])
sub
re.sub(pattern, repl, string[, count, flags])
在字串 string 中找到匹配Regexpattern 的所有子串,用另一個字串 repl 進行替換。如果沒有找到匹配 pattern 的串,則返回未被修改的 string。Repl 既可以是字串也可以是一個函數。
傳回值是替換後的新字串。
對於 RegexObject 有:
sub(repl, string[, count=0])
>>> pattern=re.compile(r‘\d‘)>>> pattern.sub(‘no‘,‘12hh34hh‘)‘nonohhnonohh‘>>> pattern.sub(‘no‘,‘12hh34hh‘,0)‘nonohhnonohh‘>>> pattern.sub(‘no‘,‘12hh34hh‘,count=0)‘nonohhnonohh‘>>> pattern.sub(‘no‘,‘12hh34hh‘,1)‘no2hh34hh‘
通過上面的例子,可以看出,count是可以預設的,同時,預設值是0,表示全部替換;否則,就是指定替換幾個。
subn
re.subn(pattern, repl, string[, count, flags])
該函數的功能和 sub() 相同,但它還返回新的字串以及替換的次數。同樣 RegexObject 有:
subn(repl, string[, count=0])
>>> pattern.subn(‘no‘,‘12hh34hh‘,count=0)(‘nonohhnonohh‘, 4)
分組
除了簡單地判斷是否匹配之外,Regex還有提取子串的強大功能。用()表示的就是要提取的分組(Group)。比如:
^(\d{3})-(\d{3,8})$分別定義了兩個組,可以直接從匹配的字串中提取出區號和本地號碼:
>>> m = re.match(r‘^(\d{3})-(\d{3,8})$‘, ‘010-12345‘)>>> m<_sre.SRE_Match object; span=(0, 9), match=‘010-12345‘>>>> m.group(0)‘010-12345‘>>> m.group(1)‘010‘>>> m.group(2)‘12345‘>>> m.groups()(‘010‘, ‘12345‘)
通過實驗,如果不用括弧,得到的Match對象課可以使用例如a.group(0)或者a.group()但是,使用a.group(1)就會報錯的。
貪婪匹配
正則匹配預設是貪婪匹配,也就是匹配儘可能多的字元。舉例如下,匹配出數字後面的0:
>>> re.match(r‘^(\d+)(0*)$‘, ‘102300‘).groups()(‘102300‘, ‘‘)
由於\d+採用貪婪匹配,直接把後面的0全部匹配了,結果0*只能匹配Null 字元串了。
必須讓\d+採用非貪婪匹配(也就是儘可能少匹配),才能把後面的0匹配出來,加個?就可以讓\d+採用非貪婪匹配:
>>> re.match(r‘^(\d+?)(0*)$‘, ‘102300‘).groups()(‘1023‘, ‘00‘)
PythonRegex學習資源
- IBM-使用 Python 模組 re 實現解析小工具
原文連結:--By Michael翔
PythonRegex學習摘要及資料