正則表達式是對字符串進行過濾的規則
python中re模塊提供了正則表達式的匹配操作
常見匹配模式
注意事項:
1.分組編號是從1開始。
2.分組的引用: \number
3.分組的別名及引用: (?P<alias>abc)(?P=alias) ? 匹配 abcabc
4.有些雖然用()括起來,但是并不是分組
5.能用非貪婪就不要用貪婪
re模塊的幾個函數
re.compile
將正則表達式編譯成正則表達式對象。
pattern = re.compile(string,flags)
match函數
從起始位置開始匹配,且只能從起始位置開始匹配,找到第一個就返回或者返回None
result = re.match(pattern,string,flags=0)
#pattern可以直接用字符串形式表示,也可以用上面的compile后的正則表達式對象
#flags 通常用到re.S,可以用.匹配換行符\n。詳見底部
result.group()
#返回結果:0表示匹配的整個串,1表示匹配的第一個分組,默認是0
search函數
掃描整個字符串,直到找到第一個就返回或者返回None
match和search比較
match必須跟字符串的頭部匹配成功,否則返回None,而search是掃描整個字符串,不需要頭部必須匹配。
結論
能用search就不要用match
findall函數
以列表的形式返回所有匹配的字符串
注意:列表中的元素將根據正則表達式的寫法。
正則表達式如果沒有分組(包括非捕獲的括號,例如"(?:abc)"),那么返回值是整個匹配串的列表;
如果有分組,那返回的列表元素是元組,元組的元素是同一個匹配串中的所有分組。
sub(pattern, repl, string[, count])函數
當repl是一個字符串時,可以使用\id或\g、\g引用分組,但不能使用編號0。
當repl是一個方法時,這個方法應當只接受一個參數(Match對象),并返回一個字符串用于替換(返回的字符串中不能再引用分組)。
count用于指定最多替換次數,不指定時全部替換。
s = 'i say, hello world!'
print re.sub('(\w+) (\w+)',r'\2 \1', s)
def func(m):
return m.group(1).title() + ' ' + m.group(2).title()
print re.sub(pattern,func, s)
### output ###
# say i, world hello!
# I Say, Hello World!
#flags
? re.I(全拼:IGNORECASE): 忽略大小寫(括號內是完整寫法,下同)
? re.M(全拼:MULTILINE): 多行模式,改變'^'和'$'的行為(參見上圖)
? re.S(全拼:DOTALL): 點任意匹配模式,改變'.'的行為
? re.L(全拼:LOCALE): 使預定字符類 \w \W \b \B \s \S 取決于當前區域設定
? re.U(全拼:UNICODE): 使預定字符類 \w \W \b \B \s \S \d \D 取決于unicode定義的字符屬性
? re.X(全拼:VERBOSE): 詳細模式。這個模式下正則表達式可以是多行,忽略空白字符,并可以加入注釋。