使用python RegExp编译的全局标志

MP0*_*MP0 5 python regex

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

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

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

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

所以我的问题仍然存在.

Kat*_*iel 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)
Run Code Online (Sandbox Code Playgroud)

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

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

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
Run Code Online (Sandbox Code Playgroud)

然后

with flag_regexen(re.DOTALL):
    <do stuff with all regexes DOTALLed>
Run Code Online (Sandbox Code Playgroud)


Woo*_*ble 7

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

r"(?s)Your.*regex.*here"
Run Code Online (Sandbox Code Playgroud)