是否可以定义全局标志,以便Python的re.compile()
自动设置它?例如,我想在我的所有RegExp中使用re.DOTALL
标志 - 例如 - 一个类?
起初可能听起来很奇怪,但由于它是由YAPPS生成的,所以我并没有真正掌控这部分代码。我只给YAPPS一个包含RegExp的字符串,它调用re.compile()
。唉,我需要在re.DOTALL
模式下使用它。
快速修复是编辑生成的解析器并添加适当的选项。但我仍然希望有另一种更自动化的方法来实现这一目标。
编辑: Python允许您使用(?...)构造设置标志,因此在我的情况下,re.DOTALL是(?s)。虽然很有用,但它不适用于整个类或文件。
所以我的问题仍然存在。
答案 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"