我在(Python3.10,windows10)中使用了正则匹配函数re.match(pattern, str)
,但是当正则表达式模式错误时,有时会发生灾难性回溯。结果,程序停留在re.match
,无法继续。
因为我有很多正则表达式,我不能一个一个地改变它们。
我尝试过限制函数的执行时间,但是因为我是windows平台,所以所有的方法都不起作用。
- Signal(仅适用于Unix)
- 函数超时
- 超时装饰器
- 埃文莱特
我的测试函数如下,我在How to limit execution time of a function call?中尝试了答案,但不起作用:
class TimeoutException(Exception):
def __init__(self, msg=''):
self.msg = msg
@contextmanager
def time_limit(seconds, msg=''):
timer = threading.Timer(seconds, lambda: _thread.interrupt_main())
timer.start()
try:
yield
except KeyboardInterrupt:
raise TimeoutException("Timed out for operation {}".format(msg))
finally:
# if the action ends in specified time, timer is canceled
timer.cancel()
def my_func():
astr = "http://www.fapiao.com/dzfp-web/pdf/download?request=6e7JGm38jfjghVrv4ILd-kEn64HcUX4qL4a4qJ4-CHLmqVnenXC692m74H5oxkjgdsYazxcUmfcOH2fAfY1Vw__%5EDadIfJgiEf"
pattern = "^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]:)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\/])+$"
reg = re.compile(pattern)
result = reg.match(astr)
return result
if __name__ == '__main__':
try:
my_func()
except TimeoutException as e:
print(e.msg)
字符串
那么有没有办法:
- 出现**“灾难性回溯”**时停止
re.match
- 限制常规匹配的次数/时间,或在匹配时间过长时引发Exception
- 或限制函数的执行时间
1条答案
按热度按时间pvcm50d11#
我知道我可以启动一个子进程,如果它在一定的时间内没有完成,我可以终止它。“worker”函数的结果
my_func
现在必须通过 * 托管队列 * 示例传递:字符串