0

我在 python 中寻找 URL 正则表达式,在阅读堆栈溢出后,我决定采用这个:http ://daringfireball.net/2010/07/improved_regex_for_matching_urls并在我的 python 代码中使用它。

我放了这样的东西:

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

(Python 2.7)

使用该正则表达式运行我的代码后,我收到以下错误:

\xe2SyntaxError:第 60 行文件中的非 ASCII 字符“ ” file.py,但未声明编码;有关详细信息,请参见http://www.python.org/peps/pep-0263.html

解决此问题的最佳方法是什么?

4

1 回答 1

1

Python 在输入编码方面存在问题(在 2 中,而不是 3 中),并且在源代码中默认为 ASCII 编码。沿着 的行在文件的第一行或第二行添加注释# encoding: utf-8,您将解决此问题。您的错误消息中链接的 PEP 很好地解释了这一点。

但是,值得注意的是,您的正则表达式对我不起作用,而只需从您链接到的站点复制一个,这似乎非常不同,确实有效。您是否考虑过使用urlparse的可能性?

如果您确实想使用正则表达式,请注意以下几点:

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

regex_a.match("http://www.www.com/thisisatest") # returns a match object
#regex_b.match("http://www.www.com/thisisatest") # edit: actually, this just hangs...

在您的版本中,似乎有许多大括号、圆括号和方括号已删除其转义,以及在奇数位置的 U+200C 和 U+200B 字符。

于 2013-03-29T03:35:31.393 回答