2012-03-22 228 views
2

我想用一個友好的unicode版本替換下面的正則表達式,該版本可以抓取像http://➡.ws和其他非ascii IRIs的東西。其目的是從用戶的文本中抓取這些文本,並將其編碼並將其html化爲真正的鏈接。蟒蛇unicode正則表達式

Python提供了一個re.UNICODE標誌,它改變了\ w的含義,但是在這種情況下(我可以看到)這不是超級有用,因爲它被定義爲「字母數字字符和下劃線」,而不是全部字符類包括下劃線。

domain_regex = re.compile(r""" 
    (
     (https?://) 
     (
      [0-9a-zA-Z] 
      [0-9a-zA-Z_-]* 
      \. 
     )+ 
     [a-zA-Z]{2,4} 
    ) 
    | # begins with an http scheme followed by a domain, or 
    (
     (?<! # negative look-behind 
      [[email protected]] 
     ) 
     (
      [0-9a-zA-Z] 
      [0-9a-zA-Z_-]* 
      \. 
     )+ 
     # top-level domain names 
     com|ca|net|org|edu|gov|biz|info|mobi|name| 
     us|uk|fr|au|be|ch|de|es|eu|it|tv|cn|jp 
    ) 
""", re.VERBOSE) 

更多非ASCII域名:

+0

這是http://stackoverflow.com/questions/1832893/python-regex-matching-unicode-properties的可能重複如果您需要更多幫助,請告知我們 – buckley 2012-03-22 22:08:50

回答

5

如果您想要寫下「\ w除了下劃線」,你可以使用否定字符類:

[^\W_] 
0

巴克利指出,"Python regex matching Unicode properties"提出了一些替代品使用正則表達式+ Unicode的Python編寫的。如果你想要的只是字母字母+下劃線字母只,也許它更容易堅持與馬克·拜爾斯建議([^\W_],分別爲\w[^\W\d_],與re.UNICODE活躍; 編輯:得到命令錯誤...)。

否則,請查找哪些字符類作爲IRI部分是有效的,或者使用支持unicode字符類的正則表達式引擎,或者 - 如果您需要純粹的python解決方案 - 我會建議我在an answer中提供的代碼該問題(或類似的解決方案)。