为python RegExp compile使用全局标志
是否可以定义一个全局标志,以便Python的为python RegExp compile使用全局标志,python,regex,Python,Regex,是否可以定义一个全局标志,以便Python的re.compile()自动设置它?例如,我想对一个类中的所有RegExp使用re.DOTALL标志 一开始可能听起来很奇怪,但我并不能真正控制这部分代码,因为它是由YAPPS生成的。我只给YAPPS一个包含RegExp的字符串,它调用re.compile()。唉,我需要在re.DOTALL模式下使用它 快速修复方法是编辑生成的解析器并添加适当的选项。但我仍然希望有另一种更自动化的方法来做到这一点 编辑: Python允许您使用(?…)构造设置标志,因
re.compile()
自动设置它?例如,我想对一个类中的所有RegExp使用re.DOTALL
标志
一开始可能听起来很奇怪,但我并不能真正控制这部分代码,因为它是由YAPPS生成的。我只给YAPPS一个包含RegExp的字符串,它调用re.compile()
。唉,我需要在re.DOTALL
模式下使用它
快速修复方法是编辑生成的解析器并添加适当的选项。但我仍然希望有另一种更自动化的方法来做到这一点
编辑:
Python允许您使用(?…)构造设置标志,因此在我的例子中,re.DOTALL是(?s)。虽然有用,但它不适用于整个类或文件
所以我的问题仍然成立。所有标志都可以在正则表达式本身中设置:
r"(?s)Your.*regex.*here"
是的,您可以将其更改为全局
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>
带有标志\u regexen(关于DOTALL):
是的,它在文档中。很抱歉,我错过了。不过,我想知道是否有一种更全局的方法,比如导入或重新定义某个东西……好吧,如果它仅用于类,它可能是有用的。您刚才回答了我的问题。@EEva:是的,但即使它只应用于类,而标志hack是活动的,所有运行的Python——其他模块中的函数、您导入的任何东西、调用的任何东西——都将调用它们的正则表达式。这可能现在或将来都不会引起问题,但如果真的发生了,问题将变得棘手且难以解决。@EEva:这就像,我不知道,让sys.version
以不同的顺序返回元组一样。你不太可能会引起问题,但因为输出不是要被第三方代码更改的,它会在不应该有错误的地方引起错误。Wooble早些时候回答了同样的问题,并花时间写下了答案,而不是评论。