我正在为垃圾邮件检查编写一个小应用程序,而且我遇到了正则表达式的问题。
让我说我有这个垃圾邮件网址:
http://hosting.tyumen.ru/tip.html
所以我想检查其网址是否有2个句号(子域+结尾),斜杠,单词,句号和“html”。
这是我到目前为止所得到的:
<a href="(http://.*?\..*?..*?/.*?.html)">(http://.*?\..*?..*?/.*?.html)</a>
可能看起来像垃圾,但它有效 - 问题:它真的很慢并且冻结我的应用程序。
有关如何优化它的任何提示? thx.re
答案 0 :(得分:5)
它变慢的原因是这种方式使用的非贪婪运算符?
容易出现catastrophic backtracking
不是说“任何数量的任何东西,而只是在不与后来的要求相冲突的程度”,这实际上是.*?
所说的,试着“尽可能地要求”不是双引号,它会终止href
“:
<a href="(http://[^"]+\.[^"]+\.[^"]+/[^"]+.html)">\1</a>
我还在\1
内的第一个捕获组中添加了一个反向引用(<a>...</a>
),这样您就不必重新进行完全相同的匹配。
请注意,如果a
在其正文中有类名,ID或其他任何内容,则此正则表达式将被破坏。我这样离开了,因为我想尽可能少地给你你所要求的东西,尽可能地给你。
答案 1 :(得分:2)
由于您声称自己是一名正则表达式新手,因此我将就创建和调试正则表达式提供更一般的建议。当它们变得非常复杂时,我发现必须使用Regexp Coach。
这是一款免费软件,真的可以省去很多麻烦。更不用说你不必每分钟构建/运行你的应用程序只是为了看看正则表达式是否按照你想要的方式工作。
答案 2 :(得分:2)
(http://[\w.-]+/.+?\.html)
- 可能仅适用于您的案例。
或者可能更快
(http://[\w.-]+/[^.]+\.html)
答案 3 :(得分:0)
#http://[-a-zA-Z0-9]+\.[-a-zA-Z0-9]+\.[-a-zA-Z]+/\w+\.html#
答案 4 :(得分:0)
在Python中,匹配以.html或.htm结尾的网址的简单方法是使用
url_re = re.compile(
r'https?://' # http:// or https://
r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?|' #domain...
r'localhost|' #localhost...
r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
r'(?::\d+)?' # optional port
r'(?:\S+.html?)+' # ending in .html
, re.IGNORECASE)
这是Django的UrlField正则表达式的修改版本。
这将匹配任何以.html或.htm结尾的网站。 (localhost,ip,domain)。