Python 正则表达式红色衬我的CPU
我需要从各种文本输入中提取URL。下面的解决方案99%的时间都在工作,但会阻塞一些输入,如下面的输入。我从来没有一个正则表达式可以在这么小的输入上最大化CPU。任何关于正则表达式有什么问题的指点都是值得赞赏的Python 正则表达式红色衬我的CPU,python,regex,Python,Regex,我需要从各种文本输入中提取URL。下面的解决方案99%的时间都在工作,但会阻塞一些输入,如下面的输入。我从来没有一个正则表达式可以在这么小的输入上最大化CPU。任何关于正则表达式有什么问题的指点都是值得赞赏的 import re url_regex = r"""(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<
import re
url_regex = r"""(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))"""
text = """background-image:url(http://109.87.135.101/infos-auto/files/2013/07/Ex-banni"""
urls = re.findall(url_regex ,text)
print urls
重新导入
(a)a-z[[[a-z[[[[w-[[w-[[[w-[[[[w-]以下以下+以下以下以下以下以下:(:(:(:(:(:(:(:(1)3)3}[a-z0-9-10-10-10-10-10 10-10-10-10-9-10-10-10-10-10-10-10-9-10-10-10-10-10-10-10-10-10-10-9-10-10-10-10-10-10-10-10-9-10-9-9-9-9-9-9-9[[[[[[[[8-8-10-8-8-8-8-8-8-8-8-8-8-8-8-8-8-8-8-8-8-10 10 10 10 10 10 10 10 10 10 10-8-10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10!()\[\]{};:“,«»””)”
text=“”背景图像:url(http://109.87.135.101/infos-auto/files/2013/07/Ex-banni"""
url=re.findall(url\u regex,文本)
打印URL
编辑:我从这里得到了这个正则表达式:
更新
在仔细查看您的正则表达式之后,您似乎遇到了多个问题。是的,灾难性回溯是其中的一部分。
但是,这不一定是一个问题。令人恼火的是,其中重叠的否定类 您有一个更大的否定类[^\s`!()\[\]{};:“,«»”']
这就是问题的根源。
因为这个被否定的类[^\s()]是那个类的子集,所以它允许
更多字符。
因为较大的类位于正则表达式的末尾,所以这就是
导致回溯问题 最后两个集群在功能上是相同的,但较大的类除外 因此,您可以将它们结合起来,以消除回溯并使 regex更有效 最终更新 较大的否定类位于原始类的末尾。
我们要做的仍然是使用较小的
否定类,允许更多的类最初通过。
我们去掉嵌套的量词,使其成为灾难性的回溯防弹
来自这个组合集群 最后,我们在末尾添加一个lookbehind断言,它接受较小的类
从较大的类中,生成一个新的否定类[^`!\[\]{};:'”,«»“'],用于断言 我们可以这样做,因为之前的集群不允许使用这些字符 其结果是,它仍在倒退,但在很大程度上,并没有这么多 您必须认识到,这种类型的正则表达式天生就易于回溯,
因为大的否定类和小的否定类之间存在差异 就而言,这是最好的吗?
答案是是没有其他修改可以让它变得更好 一张便条,你一定要告诉你从哪个人/地方或东西那里得到的
这是一个相当糟糕的正则表达式。用这个来代替
[代码>r>r(以下简称:)b((以下以下简称:[a-z[a-z[a-z][[w-[w-[w-[w-]以下以下以下以下简称:[以下以下简称:::{1,3}[a-z[a-z[a-z[a-z[a-z[a-z[a-z[a-z[a-z[a-z[a-z[[[[[a-z]]][w-[w-[w-[w-[w-[w-[w-[w-[w-[w-[w-[w-[w-[w-[w-[w-]以下以下以下以下以下以下以下以下以下以下以下以下以下以下[w-[w-[w-[w-[w-[w-[w-[w-[w-[w-[w-[w-[w-[w-[w-[w-[w-[w-[w-]]]+\))*\),想知道如何修复吗?在第二个捕获组之前,至少还有一个灾难性的回溯问题。而且,即使使用“here->”marker,很难看到您更改了什么。@user2357112-我不认为有,但从一开始,请引用我的话直到它所在的位置。我只删除了前面提到的第一个,而不是第二个。而且,我没有删除第二个潜在值是有原因的。
[^\s()]的第一个实例+
在您的新正则表达式中,它仍然位于另一个+
中,这可能导致指数级灾难性的回溯。它还与[^\s()]冗余
这是交替的另一面,可能会导致更多的回溯问题,我不知道这是否就是全部。我认为您可能看到了错误的量词。下面是一个正则表达式的示例,由于灾难性的回溯,它仍然在5秒的时间限制上超时。
r"(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]|\(([^\s()<>]|(\([^\s()<>]+\)))*\))+(?<=[^`!\[\]{};:'\".,?«»“”‘’]))"
(?i)
\b
( # (1 start)
(?:
[a-z] [\w-]+ :
(?: /{1,3} | [a-z0-9%] )
| www \d{0,3} [.]
| [a-z0-9.\-]+ [.] [a-z]{2,4} /
)
(?:
[^\s()<>]
|
\(
( # (2 start)
[^\s()<>]
| ( \( [^\s()<>]+ \) ) # (3)
)* # (2 end)
\)
)+
(?<= [^`!\[\]{};:'".,?«»“”‘’] )
) # (1 end)