Python 正则表达式红色衬我的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()<

我需要从各种文本输入中提取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()<>]+|(\([^\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)