我有一个正则表达式,尽管我在优化方面尽了最大努力,但可能需要很长时间才能执行。我希望能够在它停止的情况下中断它,并继续程序的其余部分
其他语言(如 C#)具有用于正则表达式执行的超时属性,我想知道为什么 Python 3 似乎没有相同的方法。
在内部,Python 3 具有某种最长的执行时间,因为长时间后正则表达式中止并且执行继续进行。是真的吗?
我想在python 3上分析这个问题并使用独立于平台的方法(我看到装饰器仅适用于带有信号的NIX操作系统......
也许答案是使用更通用的方法来管理这个问题 如何在 Python 中停止函数,例如如何在 Python 中为函数添加超时或使用超时停止 Python 中的函数。
如何实现这样的超时?
关于为什么 Python 的内置re
模块没有与 C# 相同的超时方法 - Tim Peters 在一个现已关闭的问题中评论了这个问题:
引入某种可选的超时太复杂了,不能在没有进行大量讨论和设计工作的情况下直接介入。
我的第一个看法是:它不会真正帮助,因为没有人会使用它,直到为时已晚。
但是,有一个名为regex
的公共 PyPI 模块,旨在提供与re
模块的完全向后兼容性,同时提供更复杂的功能(例如超时)。以下是直接来自其文档的片段,展示了如何使用它:
匹配方法和函数支持超时。超时(以秒为单位)适用于整个操作:
>>> from time import sleep
>>>
>>> def fast_replace(m):
... return 'X'
...
>>> def slow_replace(m):
... sleep(0.5)
... return 'X'
...
>>> regex.sub(r'[a-z]', fast_replace, 'abcde', timeout=2)
'XXXXX'
>>> regex.sub(r'[a-z]', slow_replace, 'abcde', timeout=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:Python310libsite-packagesregexregex.py", line 278, in sub
return pat.sub(repl, string, count, pos, endpos, concurrent, timeout)
TimeoutError: regex timed out
此模块中的超时功能非常有用,因为它直接连接到主匹配循环(请参阅safe_check_cancel
),并且不基于任何依赖于平台的解决方案,例如利用signal
模块。