2013-03-29 107 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