用[toc]
來生成目錄:
正規表示式特殊序列
re模組
re.compile(pattern[, flags])
把正規表示式的模式和標識轉化成正規表示式物件,供 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的字串
#對應的正規表示式字串變成:
#』abc-001』
因此我們強烈建議使用python的r字首,就不用考慮轉義的問題了
s = r』abc-001』 # python的字串
對應的正規表示式字串不變:
『abc-001』
search
re.search(pattern, string[, flags])`
在字串中查詢匹配正規表示式模式的位置,返回 matchobject 的例項,如果沒有找到匹配的位置,則返回 none。
對於已編譯的正規表示式物件來說(re.regexobject),有以下 search 的方法:
search (string[, pos[, endpos]])
若 regex 是已編譯好的正規表示式物件,regex.search(string, 0, 50) 等同於 regex.search(string[:50], 0)。
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() 函式只在字串的開始位置嘗試匹配正規表示式,也就是只報告從位置 0 開始的匹配情況,而 search() 函式是掃瞄整個字串來查詢匹配。如果想要搜尋整個字串來尋找匹配,應當用 search()。
雖然,match預設是從開頭匹配,但是,如果指定位置,仍然能成功;但是!match也是從指定位置開始匹配,不匹配仍然會失敗,這一點就和search有區別啦。
match()方法判斷是否匹配,如果匹配成功,返回乙個match物件,否則返回none。
test = '使用者輸入的字串'
if re.match(r'正規表示式', test):
print('ok')
else:
print('failed')
split
re.split(pattern, string[, maxsplit=0, flags=0])
此功能很常用,可以將將字串匹配正規表示式的部分割開並返回乙個列表。對 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])
在字串中找到正規表示式所匹配的所有子串,並組成乙個列表返回。同樣 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 類似,在字串中找到正規表示式所匹配的所有子串,並組成乙個迭代器返回。同樣 regexobject 有:
finditer(string[, pos[, endpos]])
subre.sub(pattern, repl, string[, count, flags])
在字串 string 中找到匹配正規表示式pattern 的所有子串,用另乙個字串 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)
分組除了簡單地判斷是否匹配之外,正規表示式還有提取子串的強大功能。用()表示的就是要提取的分組(group)。比如:
^(\d)-(\d)$分別定義了兩個組,可以直接從匹配的字串中提取出區號和本地號碼:
m = re.match(r』^(\d)-(\d)$』, 『010-12345』)通過實驗,如果不用括號,得到的match物件課可以使用例如a.group(0)或者a.group()但是,使用a.group(1)就會報錯的。m <_sre.sre_match object span="(0," match="』010-12345』">
m.group(0)
『010-12345』
m.group(1)
『010』
m.group(2)
『12345』
m.groups()
(『010』, 『12345』)
「`
貪婪匹配
正則匹配預設是貪婪匹配,也就是匹配盡可能多的字元。舉例如下,匹配出數字後面的0:
re.match(r』^(\d+)(0*)$』, 『102300』).groups()必須讓\d+採用非貪婪匹配(也就是盡可能少匹配),才能把後面的0匹配出來,加個?就可以讓\d+採用非貪婪匹配:(『102300』, 」)
由於\d+採用貪婪匹配,直接把後面的0全部匹配了,結果0*只能匹配空字串了。
歡迎使用CSDN markdow
本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...
歡迎毛毛與妞妞使用CSDN markdown編輯器
建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...
歡迎使用CSDN markdow1n編輯器
本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...