rob*_*bob 8 python regex timeout python-3.x python-re
尽管我尽了最大努力进行优化,但我有一个可能需要很长时间才能执行的正则表达式。我希望能够在它停止的情况下中断它,并继续执行程序的其余部分
其他语言(如 C#)具有用于正则表达式执行的超时属性,我想知道为什么 Python 3 似乎没有相同的方法。
Python 3 内部有一个最大执行时间,因为很长一段时间后,正则表达式中止并继续执行。这是真的吗?
我想在 python 3 上分析这个问题并使用独立于平台的方法(我看到装饰器仅在带有信号的 NIX 操作系统上工作......)
也许答案是使用关于如何在 Python 中停止函数的更通用方法来管理这个问题,例如如何在 Python 中向函数添加超时或使用超时停止 Python 中的函数。
我怎样才能实现这样的超时?
关于为什么 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模块。
| 归档时间: |
|
| 查看次数: |
2497 次 |
| 最近记录: |