用于获取URL的正则表达式失败

时间:2013-10-24 18:47:30

标签: python html regex url

我找到了regex for getting urls from pages

(?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`!()\[\]{};:'".,<>?«»“”‘’]))

但是,我无法在python中应用它。甚至声明包含此表达式的变量也会失败并显示“无效语法”消息:

Python 2.7.5 (default, Sep  6 2013, 09:55:21) 
[GCC 4.8.1 20130725 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a = "(?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`!()\[\]{};:'".,<>?«»""'']))"
  File "<stdin>", line 1
    a = "(?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`!()\[\]{};:'".,<>?«»""'']))"
                                                                                                                                                                                                        ^
SyntaxError: invalid syntax

我试一试here and it worked well。有谁知道如何让这个工作?

1 个答案:

答案 0 :(得分:2)

你的正则表达式字符串以;:'"末尾的双引号结束,这就是为什么它是语法错误。

pythonregex.com自动添加一个\来逃避“,生成:

regex = re.compile("(?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`!()\[\]{};:'\".,<>?«»“”‘’]))")

请注意,它有;:'\"而不是;:'"。令我感到惊讶的是,写过pythonregex.com的人决定为你添加逃避而不是让它给你一个语法错误。

我发现在我的翻译中我需要使用python r"raw string syntax"来使其工作:

In [31]: string="foo.com/blah_blah kuhiuh www.example.com"

In [32]: In [29]: regex = re.compile(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`!()\[\]{};:'\".,<>?«»“”‘’]))")

In [33]: regex.findall(string)
Out[33]: [('foo.com/blah_blah', '', '', '', ''), ('www.example.com', '', '', '', '')]

不确定哪个角色是必要的,但肯定会有一些奇怪的角色。