在 python re.findall 中使用多个标志

Posted

技术标签:

【中文标题】在 python re.findall 中使用多个标志【英文标题】:Using more than one flag in python re.findall 【发布时间】:2015-08-19 12:04:50 【问题描述】:

我想在re.findall 函数中使用多个标志。更具体地说,我想同时使用IGNORECASEDOTALL 标志。

x = re.findall(r'CAT.+?END', 'Cat \n eND', (re.I, re.DOTALL))

错误:

Traceback (most recent call last):
  File "<pyshell#78>", line 1, in <module>
    x = re.findall(r'CAT.+?END','Cat \n eND',(re.I,re.DOTALL))
  File "C:\Python27\lib\re.py", line 177, in findall
    return _compile(pattern, flags).findall(string)
  File "C:\Python27\lib\re.py", line 243, in _compile
    p = sre_compile.compile(pattern, flags)
  File "C:\Python27\lib\sre_compile.py", line 500, in compile
    p = sre_parse.parse(p, flags)
  File "C:\Python27\lib\sre_parse.py", line 673, in parse
    p = _parse_sub(source, pattern, 0)
  File "C:\Python27\lib\sre_parse.py", line 308, in _parse_sub
    itemsappend(_parse(source, state))
  File "C:\Python27\lib\sre_parse.py", line 401, in _parse
    if state.flags & SRE_FLAG_VERBOSE:
TypeError: unsupported operand type(s) for &: 'tuple' and 'int'

有没有办法使用多个标志?

【问题讨论】:

查看re.compile的文档。 除了@PeterWood的链接:docs.python.org/2.7/howto/regex.html#compilation-flags 如果你使用很多正则表达式,如果可以的话,最好使用内联修饰符。主要是因为您实际上并未将 FLAGS 与 FindAll 函数一起使用,它们被传递并附加到正则表达式对象。修饰符绑定到正则表达式对象,而不是正则表达式使用函数。因此,如果您在其他地方剪切并粘贴正则表达式,您根本不必担心标志。所以,r'(?si)CAT.+?END' 是最好的方法。 @PeterWood,3.8.1 的文档对这个问题没用。 @ZachYoung 我在 5 1/2 年前回答了这个问题。 【参考方案1】:

您不能将标志放在元组中。在标志中使用管道字符(或操作数):

x = re.findall(r'CAT.+?END','Cat \n eND',flags=re.I | re.DOTALL)

【讨论】:

【参考方案2】:

是的,但您必须将它们组合在一起:

x = re.findall(pattern=r'CAT.+?END', string='Cat \n eND', flags=re.I | re.DOTALL)

【讨论】:

我总是鼓励大家在传递标志时使用flags=。如果不这样做,my_regex.searchmy_regex.match 会将标志(内部为 ints)解释为 pos 参数。所以你的意思是做my_regex.search(my_str, re.DOTALL),但这会被解释为my_regex.search(my_str, pos=16)。如果你总是使用flags=,你会得到上面的错误,你会正确地使用re.search 在官方文档中是docs.python.org/3/library/re.html#re.compile>下的第二句【参考方案3】:

有没有办法使用多个标志?

没有提到,但你也可以使用inline (?...) modifiers

x = re.findall(r'(?si)CAT.+?END', 'Cat \n eND')

【讨论】:

以上是关于在 python re.findall 中使用多个标志的主要内容,如果未能解决你的问题,请参考以下文章

python正则中re.findall匹配多个条件

re模块中的非贪婪匹配

python:非正则表达式等价于 re.findall

Python中的re.findall('(\d)\\1+','33acad122')怎么理解,求详

python RE findall() 返回值是一个完整的字符串

Python:使用re.substitute作为模板时保持行格式(breaklines)