如何向 Python 3 RegEx 添加超时?

rob*_*bob 8 python regex timeout python-3.x python-re

尽管我尽了最大努力进行优化,但我有一个可能需要很长时间才能执行的正则表达式。我希望能够在它停止的情况下中断它,并继续执行程序的其余部分

其他语言(如 C#)具有用于正则表达式执行的超时属性,我想知道为什么 Python 3 似乎没有相同的方法。

Python 3 内部有一个最大执行时间,因为很长一段时间后,正则表达式中止并继续执行。这是真的吗?

我想在 python 3 上分析这个问题并使用独立于平台的方法(我看到装饰器仅在带有信号的 NIX 操作系统上工作......)

也许答案是使用关于如何在 Python 中停止函数的更通用方法来管理这个问题,例如如何在 Python 中向函数添加超时使用超时停止 Python 中的函数

我怎样才能实现这样的超时?

Xid*_*doc 5

关于为什么 Python 的内置re模块没有与 C# 相同的超时方法 - Tim Peters 在现已关闭的问题中评论了此事:

引入某种可选的超时太复杂了,不能在没有经过大量讨论和设计工作的情况下就直接介入。

我的第一个看法是:这并没有真正的帮助,因为没有人会使用它,直到为时已晚。

然而,有一个名为的公共 PyPI 模块regex,旨在提供与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:\Python310\lib\site-packages\regex\regex.py", line 278, in sub
    return pat.sub(repl, string, count, pos, endpos, concurrent, timeout)
TimeoutError: regex timed out
Run Code Online (Sandbox Code Playgroud)

该模块中的超时功能非常棒,因为它直接连接到主匹配循环(请参阅 参考资料safe_check_cancel),并且不基于任何依赖于平台的解决方案,例如利用该signal模块。