使用python RegExp编译的全局标志

时间:2011-08-04 15:11:41

标签: python regex

是否可以定义全局标志,以便Python的re.compile()自动设置它?例如,我想在我的所有RegExp中使用re.DOTALL标志 - 例如 - 一个类?

起初可能听起来很奇怪,但由于它是由YAPPS生成的,所以我并没有真正掌控这部分代码。我只给YAPPS一个包含RegExp的字符串,它调用re.compile()。唉,我需要在re.DOTALL模式下使用它。

快速修复是编辑生成的解析器并添加适当的选项。但我仍然希望有另一种更自动化的方法来实现这一目标。

编辑: Python允许您使用(?...)构造设置标志,因此在我的情况下,re.DOTALL是(?s)。虽然很有用,但它不适用于整个类或文件。

所以我的问题仍然存在。

2 个答案:

答案 0 :(得分:10)

是的,您可以将其更改为全局re.DOTALL。但你不应该。全局设置在最好的时候是个坏主意 - 这可能会导致同一个Python实例运行的任何Python代码中断。


所以,不要这样做

您可以更改它的方法是使用Python解释器为每个实例缓存模块的事实,这样如果其他人导入相同的模块,他们就会获得您也可以访问的对象。因此,您可以将re.compile重新绑定到通过re.DOTALL

的代理函数
import re
re.my_compile = re.compile
re.compile = lambda pattern, flags: re.my_compile(pattern, flags | re.DOTALL)

这种变化将发生在其他所有人身上。

您甚至可以在上下文管理器中将其打包,如下所示:

from contextlib import contextmanager

@contextmanager
def flag_regexen(flag):
    import re
    re.my_compile = re.compile
    re.compile = lambda pattern, flags: re.my_compile(pattern, flags | flag)
    yield
    re.compile = re.my_compile

然后

with flag_regexen(re.DOTALL):
    <do stuff with all regexes DOTALLed>

答案 1 :(得分:7)

所有标志都可以在正则表达式中设置:

r"(?s)Your.*regex.*here"