2016-03-03 7 views
5

私は、文字とそのすべての可能な発音区別のバリエーション(アクセントを区別しない)を正規表現で照合しようとしています。Regex - 文字とそのすべての発音区別のバリエーション(アクセントを区別しない)

re.match(r"^[eēéěèȅêęëėẹẽĕȇȩę̋ḕḗḙḛḝė̄]$", "é") 

が、それは一般的な解決策ではありません。私はもちろん行うことができますすることです。 \pLのようなユニコードカテゴリを使用すると、特定の文字との一致を減らすことはできません。この場合、eです。

+0

Python正規表現は* POSIX文字同値*マッチをサポートしていますか?これは '[= e =]'と同じくらいシンプルですが、大文字と同等のものもあります。これは、 '(?!\ u)'を使ってうまくいく可能性がありますが、これは全てのUnicode文字に対して大文字をサポートする正規表現を必要とします。 – usr2564301

答えて

12

最初のすべての発音区別符号を取り除くためにunidecodeを使用してから、ちょうど

re.match(r"^e$", unidecode("é")) 

それとも、この簡略化された場合に、通常のe

agains一致するだろう所望の目的を達成するための回避策

unidecode("é") == "e" 

ユニコード・ライブラリーに依存しない別のソリューションは、ユニコードを保持し、手動でダイアライ

使用unicodedata.normalize()éなどの確認複合文字がdecompositeフォームe\u301(ACUTE ACCENTを組み合わせるのE +)

>>> input = "Héllô" 
>>> input 
'Héllô' 
>>> normalized = unicodedata.normalize("NFKD", input) 
>>> normalized 
'He\u0301llo\u0302' 
になって取得すること、(分解用)正規形Dにあなたの入力文字列をオンにする:次のようにチック

次に、カテゴリMark, Nonspacing(短いMn)に属するすべてのコードポイントを削除します。それらは、幅のないすべての文字で、直前の文字を飾るだけです。 unicodedata.category()を使用してカテゴリを決定します。

>>> stripped = "".join(c for c in normalized if unicodedata.category(c) != "Mn") 
>>> stripped 
'Hello' 

この結果は、上記のunidecode-exampleと同様に、正規表現マッチングのソースとして使用できます。 ここでは関数としてのすべてのことがあります:

def remove_diacritics(text): 
    """ 
    Returns a string with all diacritics (aka non-spacing marks) removed. 
    For example "Héllô" will become "Hello". 
    Useful for comparing strings in an accent-insensitive fashion. 
    """ 
    normalized = unicodedata.normalize("NFKD", text) 
    return "".join(c for c in normalized if unicodedata.category(c) != "Mn") 
関連する問題