2011-01-18 5 views
13

ウェブサイトから入力された文字列が英数字で、おそらくアンダースコアを含んでいるかどうかを確認するために探しています。 マイコード:Python:英数字と一致する正規表現が機能していませんか?

if re.match('[a-zA-Z0-9_]',playerName): 
      # do stuff 

何らかの理由で、これは例えば狂気の文字と一致:NIG○▲☆★◇◆

私は何かがあり、通常のAZと0-9と_マッチングをしたいです私はここで行方不明ですか?

答えて

25

Pythonは英数字を照合するための特別なシーケンス\wを持っており、LOCALEUNICODEフラグが指定されていないとき下線:代わりにこれを試してみてください。つまり、あなたのパターン英数字で、おそらくアンダースコアが含まれている場合

pattern = '^\w+$'

+3

LOCALEまたはUNICODE AREを指定するとどうなりますか? – interstar

+1

チェックしませんでしたが、指定されたロケールの英数字と一致する必要があります。 – Rozuur

19

あなたの正規表現は1文字にしか一致しません。

if re.match('^[a-zA-Z0-9_]+$',playerName): 
1

、と...チェックを変更することができます。

これは文字通り、1つのアンダースコアしか許されないのですか? (プレイヤーの名前には不合理ではなく、特に隣接するアンダースコアは他のプレイヤーが読むのが難しいかもしれません。) "a_b_c"は一致しないといけませんか?

その場合:

if playerName and re.match("^[a-zA-Z0-9]*_?[a-zA-Z0-9]*$", playerName): 

正規表現を簡素化する空の値、条件チェックの新しい最初の部分。

"_a"、 "a_"、 "_"のすべてが一致するので、アンダースコアの場所に制限はありません。先頭と末尾のアンダースコアの両方を防止したい場合は、次のように変更してください:

if re.match("^[a-zA-Z0-9]+(?:_[a-zA-Z0-9]+)?$", playerName): 
// this regex doesn't match an empty string, so that check is unneeded 
関連する問題