2013-03-29 82 views
0

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

我已经把这样的事情:

SyntaxError: Non-ASCII character ' \xe2 ' in file file.py on line 60, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

的是:

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版)

运行我的代码与正则表达式我收到以下错误后解决这个问题的最好方法是什么?

+5

你有卷曲的引号和非ASCII字符:'«»“”'''。阅读PEP。 – Blender

回答

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字符。

+0

我得到同样的错误与regexp_a和b,编码问题仍然存在。 – user109074

+0

你把'#encoding:utf-8'作为源代码文件的第一行还是第二行?请注意,它*必须*在第一行或第二行;它不能简单地在任何地方。 – cge

+0

编码,是我的问题。谢谢 – user109074