2012-03-22 16 views
2

以下の正規表現をユニコード対応のバージョンに置き換えて、http://➡.wsやその他の非ascii IRIsのようなものをキャッチしたいと思います。目的は、ユーザーのテキストからこれらを取り出し、それらを実際のリンクにエンコードし、HTML化することです。python unicode regex

Pythonは\ wの意味を変更するre.UNICODEフラグを提供していますが、これは「英数字とアンダースコア」として定義されているため、文字クラスにはアンダースコアが含まれます。

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

答えて

5

あなたの場合「\ w:アンダースコアを除く」と書いたければ、ネゲートされた文字クラスを使用することができます:

[^\W_] 
0

バックリーが指摘したように、"Python regex matching Unicode properties"はPythonで正規表現+ Unicodeを使用するために、いくつかの選択肢を提示します。何をしたいことがちょうど英数字ある場合は、は英数字+のみまたは文字をアンダースコア、多分それはアクティブre.UNICODEで、マーク・バイヤースの提案(それぞれ[^\W_]\w[^\W\d_]に固執する方が簡単です。編集:は順序が間違っていました...)。

それ以外の場合は、IRIパートとして有効な文字クラスを調べて、Unicode文字クラスをサポートする正規表現エンジンを使用するか、純粋なPythonソリューションが必要な場合は、an answerその質問(またはそれに類する解決策)。