正则表达式是对字符串进行过滤的规则
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): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。