2009-03-09 12 views
3

ASCIIでは、名前を検証することはあまり難しくありません。すべての文字がアルファベット順であることを確認してください。ユニコード名の検証

しかし、Unicode(utf-8)はどうですか?指定した文字列にカンマやアンダースコア(ASCIIスコープ外)がないことを確認するにはどうすればよいですか?

あなたはこの正規表現に対してそれをチェックして行くことができる、「名前」を定義する方法に応じて

(理想的にはPythonで)

答えて

5

にフィルタリングするユニコードオブジェクトへの(あなたのUTF-8)と、すべての文字がアルファベットかどうかを確認することができます

s.isalpha() 

このメソッドは、ロケールに依存バイト文字列のためです。

1

^\w+$ 

しかし、これは数字とアンダースコアを許可します。それらを除外するには、

[\d_] 

の2番目のテストを行うことができます。これら2つは次のように組み合わせることができます:

^(?:(?![\d_])\w)+$ 

しかし、正規表現のパフォーマンス上の理由から、私はむしろ2つの別々のチェックを行います。 the docsから

\w

LOCALEUNICODEフラグが指定されていない され、任意の 英数字とアンダースコア と一致します。これは セット[a-zA-Z0-9_]に相当します。 LOCALEでは、 は、[0-9_]と一致し、現在のロケールでは の英数字として定義されている と一致します。 UNICODEが の場合、これは [0-9_]に加えて、 英数字の英数字の文字と一致します(Unicode文字 プロパティデータベース)。

0

stringモジュールのlettersプロパティは、必要なものを提供する必要があります。このプロパティはロケール固有のものであるため、渡されるテキストの言語を知っている限り、setlocale()を使用してこれらの文字に対して検証できます。

http://docs.python.org/library/string.html#module-string

あなたが指摘するように、しかし、真の「ユニコード」の世界で、あなたは言葉を知らない限り、「アルファベット」であるかの文字を知るために、すべての方法はありません。言語がわからない場合は、ASCIIにデフォルト設定するか、共通言語用にロケールを実行します。

+0

あなたは、「どのキャラクターを知っているか知っていることは知りません」と言っています。 unicodedata.category(u "\ u0393")は大文字であることを示します。 – tzot

+0

Unicode文字データベースの一般的なカテゴリプロパティは、この主な特性を決定するのに適していることが多いのですが、多くの文字は言語と文脈によって複数の用途があります。すべてのケースがunicodedata.categoryによってカバーされるわけではありません。カテゴリ() –

+0

http://www.unicode.org/Public/5.1.0/ucd/UCD.html#General_Category_Valuesおよびhttp://www.unicode.org/versions/Unicode5を参照してください。 .0.0/ch04.pdf –

5

おそらくunicodedata moduleがこのタスクに役立ちます。特にcategory()の機能。既存のユニコードカテゴリについてはunicode.orgをご覧ください。その後、ちょうどバイト文字列を変換するなどの句読点文字

1

これは解決への第一歩かもしれません:

import unicodedata 
EXCEPTIONS= frozenset(u"'.") 
CATEGORIES= frozenset(('Lu', 'Ll', 'Lt', 'Pd', 'Zs')) 
# O'Rourke, Franklin D. Roosevelt 

def test_unicode_name(unicode_name): 
    return all(
     uchar in EXCEPTIONS 
     or unicodedata.category(uchar) in CATEGORIES 
     for uchar in unicode_name) 

>>> test_unicode_name(u"Michael O'Rourke") 
True 
>>> test_unicode_name(u"Χρήστος Γεωργίου") 
True 
>>> test_unicode_name(u"Jean-Luc Géraud") 
True 

は例外、私はおそらく逃し、さらにチェックを追加します。

関連する問題