Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为python RegExp compile使用全局标志_Python_Regex - Fatal编程技术网

为python RegExp compile使用全局标志

为python RegExp compile使用全局标志,python,regex,Python,Regex,是否可以定义一个全局标志,以便Python的re.compile()自动设置它?例如,我想对一个类中的所有RegExp使用re.DOTALL标志 一开始可能听起来很奇怪,但我并不能真正控制这部分代码,因为它是由YAPPS生成的。我只给YAPPS一个包含RegExp的字符串,它调用re.compile()。唉,我需要在re.DOTALL模式下使用它 快速修复方法是编辑生成的解析器并添加适当的选项。但我仍然希望有另一种更自动化的方法来做到这一点 编辑: Python允许您使用(?…)构造设置标志,因

是否可以定义一个全局标志,以便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早些时候回答了同样的问题,并花时间写下了答案,而不是评论。