gpt4 book ai didi

python2 re.sub : abort catastrophic pattern on backtracking

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:54 35 4
gpt4 key购买 nike

我正在使用 re.sub()使用一些可能导致回溯的复杂模式(由代码创建)。

在 Python 2.6 中经过一定次数的迭代后,是否有任何实用的方法来中止 re.sub(假设未找到模式,或引发错误)?

示例(这当然是一个愚蠢的模式,但它是由复杂的文本处理引擎动态创建的):

>>>re.sub('[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i!|](?:[^l1i !||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i!|](?:[^ l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i!|](?:[ ^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i!|](?: [^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i!|](? :[^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i!|]( :[^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i!|] (?:[^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i!| ](?:[^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i! |](?:[^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i !|](?:[^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[ l1i!|](?:[^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])* [l1i!|](?:[^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|]) *[l1i!|](?:[^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|] )*[l1i!|](?:[^l1i!||\\w]|[l1i!|])*','*','ilililililililililililililililililililililililililililililililililil :x')

最佳答案

除了分析正则表达式的潜在灾难性回溯(外部正则表达式的难题)或使用不允许回溯的不同正则表达式引擎之外,我认为唯一的方法是使用这种性质的超时:

import re
import signal

class Timeout(Exception):
pass

def try_one(pat,rep,s,t=3):
def timeout_handler(signum, frame):
raise Timeout()

old_handler = signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(t)

try:
ret=re.sub(pat, rep, s)

except Timeout:
print('"{}" timed out after {} seconds'.format(pat,t))
return None

finally:
signal.signal(signal.SIGALRM, old_handler)

signal.alarm(0)
return ret

try_one(r'^(.+?)\1+$', r'\1' ,"a" * 1000000 + "b")

尝试替换大量重复的单个字符(在本例中为一百万个“a”字符)是一个 classic catastrophic regex failure .这将需要数万年才能完成(至少使用 Python 或 Perl。Awk 则不同)。

尝试 3 秒后,正常超时并打印:

"^(.+?)\1+$" timed out after 3 seconds

关于python2 re.sub : abort catastrophic pattern on backtracking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12471169/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com