Python正则-多行匹配

来源:互联网 发布:广州java培训哪里好 编辑:程序博客网 时间:2024/06/06 04:54

一些regular的tips:

1 非贪婪flag

>>> re.findall(r"a(\d+?)", "a23b")        ['2']>>> re.findall(r"a(\d+)", "a23b")        ['23']

注意比较这种情况:
>>> re.findall(r"a(\d+)b", "a23b")        ['23']>>> re.findall(r"a(\d+?)b", "a23b")        ['23']

2 如果你要多行匹配,那么加上re.S和re.M标志
re.S:.将会匹配换行符,默认.不会匹配换行符
>>> re.findall(r"a(\d+)b.+a(\d+)b", "a23b\na34b")        []>>> re.findall(r"a(\d+)b.+a(\d+)b", "a23b\na34b", re.S)        [('23', '34')]>>>re.M:^$标志将会匹配每一行,默认^和$只会匹配第一行>>> re.findall(r"^a(\d+)b", "a23b\na34b")        ['23']>>> re.findall(r"^a(\d+)b", "a23b\na34b", re.M)        ['23', '34']但是,如果没有^标志,>>> re.findall(r"a(\d+)b", "a23b\na23b")        ['23', '23']可见,是无需re.MPopularity: 53%

 
 

re.compile(strPattern[, flag]):

这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。 第二个参数flag是匹配模式,取值可以使用按位或运算符'|'表示同时生效,比如re.I | re.M。另外,你也可以在regex字符串中指定模式,比如re.compile('pattern', re.I | re.M)与re.compile('(?im)pattern')是等价的。
可选值有:

  • re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
  • M(MULTILINE): 多行模式,改变'^'和'$'的行为(参见上图)
  • S(DOTALL): 点任意匹配模式,改变'.'的行为
  • L(LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
  • U(UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性
  • X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。
 
 
a = re.compile(r"""\d +  # the integral part                    \.    # the decimal point                    \d *  # some fractional digits""", re.X) b = re.compile(r"\d+\.\d*") 


re提供了众多模块方法用于完成正则表达式的功能。这些方法可以使用Pattern实例的相应方法替代,唯一的好处是少写一行re.compile()代码,但同时也无法复用编译后的Pattern对象。这些方法将在Pattern类的实例方法部分一起介绍。如上面这个例子可以简写为:

12 m = re.match(r'hello', 'hello world!') print m.group() 


 

re模块还提供了一个方法escape(string),用于将string中的正则表达式元字符如*/+/?等之前加上转义符再返回,在需要大量匹配元字符时有那么一点用。

 
 
参考:http://www.juyimeng.com/python-multi-line-non-greedy-regular-expression-sample.html
原创粉丝点击