正則是處理字串最常用的方法,我們編碼中到處可見正則的身影。
正則大同小異,python 中的正則跟其他語言相比略有差異:
1、替換字串時,替換的字串可以是乙個函式
2、split 函式可以指定分割次數,這會導致有個坑
3、前項界定的表示式必須定長
下面詳細描述下 re 模組的使用方法,其實,注意上面提到的三點差異就好
1、match
說明:re.match 嘗試從字串的起始位置匹配乙個模式,如果不是起始位置匹配成功的話,match()就返回 none。
語法:re.match(pattern, string, flags=0)
flags為可選標識,多個標識可以通過按位或 (|) 來指定。如 re.i | re.m 被設定成 i 和 m 標識:
修飾符描述
re.i
使匹配對大小寫不敏感
re.l
做本地化識別(locale-aware)匹配
re.m
多行匹配,影響 ^ 和 $
re.s
使 . 匹配包括換行在內的所有字元
re.u
根據unicode字符集解析字元。這個標誌影響 \w, \w, \b, \b.
re.x
該標誌通過給予你更靈活的格式以便你將正規表示式寫得更易於理解。
匹配成功re.match方法返回乙個匹配的物件,可以使用group(num) 或 groups() 匹配物件函式來獲取匹配表示式。group() 或 group(0),返回整個正規表示式的匹配結果。
舉例:s= 'abc123abc'
print(re.match('[a-z]+', s)) # <_sre.sre_match object span="(0," match="abc">
print(re.match('[a-z]+', s).group(0)) # abc
print(re.match('[\d]+', s)) # none
print(re.match('[a-z]+', s, re.i).group(0)) # abc
print(re.match('[a-z]+', s).span()) # (0, 3)
2、search
說明:re.search 掃瞄整個字串並返回第乙個成功的匹配。
語法:re.search(pattern, string, flags=0)
匹配成功re.search方法返回乙個匹配的物件,否則返回none。可以使用group(num) 或 groups() 匹配物件函式來獲取匹配表示式。
s = 'abc123abc'
print(re.se程式設計客棧arch('[a-z]+', s).group()) # abc
print(re.search('[a-z]+', s).span()) # (0, 3)
print(re.search('[\d]+', s).group()) # 123
print(re.search('[\d]+', s).span()) # (3, 6)
print(re.search('xyz', s)) # none
groupdict
groupdict 返回匹配到的所有命名子組的字典。
print(re.search('[a-z]+', s).groupdict()) # {}
print(re.search('(?p[a-z]+)(npthhu?p\d+)', s).groupdict()) #
3、sub 和 subn
說明:re.sub用於替換字串中的匹配項。
re.subn返回乙個元組,包含替換後的字串及替換次數。
語法:sub(pattern, repl, string, count=0, flags=0)
repl: 替換的字串,也可為乙個函式。
count: 模式匹配後替換的最大次數,預設 0 表示替換所有的匹配。
舉例:s = 'abc123abc'
print(re.sub('[\d]+', '數字', s)) # abc數字abc
print(re.sub('[a-z]+', '字母', s, 1)) # 字母123abc
# 將匹配的數字乘以 2
def double(matched):
value = int(matched.group('value'))
return str(value * 2)
# repl是乙個函式
print(re.sub('(?p\d+)', double, s)) # abc246abc
print(re.subn('[\d]+', '數字', s)) # ('abc數字abc', 1)
print(re.subn('[a-z]+', '字母', s,)) # ('字母123字母', 2)
print(re.subn('[a-z]+', '字母', s, 1)) # ('字母123字母', 1)
4、compile
說明:re.compile 用於編譯正規表示式,生成乙個正規表示式(pattern)物件,供 match() 和 search() 這兩個函式使用。
語法:compile(pattern, flags=0)
舉例:s = 'abc123abc'
p = re.compile('[\d]+')
print(p.match(s, 4, 5).group(0)) # 2 從位置4開始匹配到位置5
print(p.search(s).group(0)) # 123
5、findall
說明:re.findall 在字串中查詢正規表示式所匹配的所有子串,並返回乙個列表,如果沒有找到匹配的,則返回空列表。
語法:findall(pattern, string, flags=0)
舉例:s = 'abc123abc'
print(re.findall('[a-z]+', s)) # ['abc', 'abc']
print(re.findall('[h-n]+', s)) #
6、finditer
說明:finditer和 findall 類似,在字串中查詢正規表示式所匹配的所有子串,並把它們作為乙個迭代器返回。
語法:finditer(pattern, string, flags=0)
舉例:s = 'abc123def'
it = re.finditer('[a-z]+', s)
for match in it:
print(match.group())
7、split
說明:re.split 方法按照能夠匹配的子串將字串分割後返回列表。
語法:split(pattern, string, maxsplit=0, flags=0)
maxsplit:分隔次數,maxsplit=1 分隔一次,預設為 0,不限制次數。
舉例:print(re.split('a', '1a1a2a3', re.i)) # ['1a1', '2a3']
# 輸出結果並未能區分大小寫,這是因為re.split(pattern,string,maxsplit, flags)預設是四個引數,當我們傳入的三個引數的時候,系統會預設re.i是第三個引數,所以就沒起作用。
# 如果想讓這裡的re程式設計客棧.i起作用,寫成flags=re.i即可。
print(re.split('a', '1a1a2a3', flags=re.i)) # ['1', '1', '2', '3']
8、escape
說明:re.escape對字串裡面的特殊字串進行轉義。
語法:escape(pattern)
舉例:print(re.escape('www.dxy.cn')) # www\.dxy\.cn
9、正則
「(?p…)」:分組,並將其命名為。
「(?p=name)」:引用別名為的分組匹配到的串。
10、前項(否定)界定中的特殊
正則中常用的前項界定(?<=exp)和前項否定界定(?
(?<=aaa) # 正確
(?<=aaa|bbb) # 正確
(?<=aaa|bb) # 錯誤
(?<=\d+) # 錯誤
(?<=\d) # 正確
本文標題: 詳解python正規表示式re模組
本文位址: /jiaoben/python/254610.html
python 正規表示式 re
match 和 search 的區別 match是從字串開頭匹配,而search是在整個字串中匹配。如 p re.compile a z p.match message none 因為開頭是 因此無法匹配 而 m p.search message print m re.matchobject ins...
python正規表示式 re
re.match 嘗試從字串的開始匹配乙個模式,如 下面的例子匹配第乙個單詞。import retext jgood is a handsome boy,he is cool,clever,and so on.m re.match r w s text ifm print m.group 0 n m...
python正規表示式(re)
在python中re模組用於對正規表示式 regular expression 的支援。正規表示式是可以匹配文字片段的模式。一 正規表示式的書寫 1 萬用字元 點 可以匹配任何字元 除了換行符 如 ike 可以匹配 bike like 等 2 對特殊字元進行轉義 在正規表示式中如果是引用特殊字元作為...