2017-08-28 17 views
3

文字列にはPython 2.7の文字(すべての言語の文字)のみが含まれているかどうかを確認する方法を理解しようとしました。私はこのコードを試してみました:Python 2.7:正規表現 - 任意の言語の任意の文字に一致する

# -*- coding: utf-8 -*- 
import re 

def main(): 
    regexp1 = re.compile('[^\W\d_]+', re.IGNORECASE | re.UNICODE) 
    regexp2 = re.compile('[\p{L}]+', re.IGNORECASE | re.UNICODE) 

    print("1", regexp1.search(u"test")) 
    print("2", regexp1.search(u'äö')) 
    print("3", regexp1.search(u'...')) 
    print("4", regexp1.search(u'9a')) 
    print("5", regexp1.search(u'New/York')) 

    print("6", regexp2.search(u"test")) 
    print("7", regexp2.search(u'äö')) 
    print("8", regexp2.search(u'...')) 
    print("9", regexp2.search(u'9a')) 
    print("10", regexp2.search(u'New/York')) 

if __name__ == '__main__': 
    main() 

出力:

('1', <_sre.SRE_Match object at 0x02ACF678>) 
('2', <_sre.SRE_Match object at 0x02ACF678>) 
('3', None) 
('4', <_sre.SRE_Match object at 0x02ACF678>) 
('5', <_sre.SRE_Match object at 0x02ACF678>) 
('1', None) 
('2', None) 
('3', None) 
('4', None) 
('5', None) 

私は、文字列にマッチします正規表現をしたい№1と文字列№2(任意の言語からの手紙と文字列のみ)。しかし、これは文字を含む文字列に一致するようになりました(数字と/も含まれています)。

また、\p{L}正規表現を使用しようとしましたが、全く動作しません。私はこの正規表現を試しました:[\p{L}]+(\p{L})+\p{L}

+0

anubhava、私はちょうど数字1の文字列と数字2の文字列(プログラムコードではない)を指したがっています。 – Gooman

答えて

3

regexp1が良いスタートです。問題は、regexp1が少なくとも1つの文字を含む文字列と一致し、文字のみを含む文字列は一致しないことです。これを試してみてください:

regexp1 = re.compile('^[^\W\d_]+$', re.IGNORECASE | re.UNICODE) 

この「アンカー」のマッチの両方を先頭にし、文字列の末尾に、それだけで「新規/ニューヨーク」の「新規」の部分を照合することができませんことを意味。

python reモジュールは、\p{L}のような文字クラスをサポートしていないようですが、サードパーティのregexモジュールがあります。 https://pypi.python.org/pypi/regex/のドキュメントを参照してください。ただし、そのモジュールのパフォーマンスや標準準拠については言及できません。

+0

ありがとう、それは動作します! Pythonで\ p {L}を使用したいと考えている他の人々にも役立つことを願っています。 – Gooman

1

reドキュメントでは、サードパーティのregex moduleが、より多くの機能とより優れたUnicodeサポートについて推奨されています。特に、それは\pパターンをサポートしていますので、

\p{L}+ 

は、Unicode文字の任意の文字列にマッチする、regex正規表現で正常に動作する必要があります。

しかし、あなたは慎重でなければなりません。結合発音記号は手紙ではありません。結合記号を受け入れるように正規表現を変更するか、NFC形式で入力を正規化していくつかの結合記号を前の文字に組み合わせることができますが、まず "文字のみを含む"という定義について非常に慎重に考えるべきです。

また、searchは文字列のみ文字列全体が正規表現に一致していないかどうか、正規表現に一致するものを含まれているかどうかをチェックします。文字列全体を一致させるためにfullmatchをお勧めしますが、これはPython 3.4以降でのみ可能です。 2.7のために、私は正規表現を固定すると言うでしょう:

^\p{L}+$ 

あなたはまだそれが全体の文字列の一致を表したり、それならばどうかを確認するために、マッチオブジェクトを調べる必要がありますので、その$は、末尾の改行の前に右一致させることができますを除いて末尾の改行の前で止まります。

関連する問題