2011-01-18 24 views
13

Alfa-sayısal ve muhtemelen alt çizgi içerip içermediğini kontrol etmek için bir web sitesinden girilen bir dizeyle eşleştirmeyi düşünüyorum. Kodum: NedensePython: Alfa-numeric ile eşleşecek düzenli ifade çalışmıyor.

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

, bu örnek için çılgın karakter ile eşleşir: Nig ○ ▲ ☆ şey

Ben sadece düzenli AZ ve 0-9 ve _ eşleştirme istiyorum ◇ var ◆ ★ ben burada özlüyorum

cevap

25

Python alfasayısal eşleştirmek için özel bir diziyi \w vardır ve LOCALE ve UNICODE bayrakları belirtilen zamanlarda altını: Bu yolu deneyin. Dolayısıyla bunu deseni alfanümerik olduğunu ve muhtemelen bir alt çizgi içeriyorsa

pattern = '^\w+$'

+3

belirtilen ARE ne olur: Bunun yerine oyuncu adları için yine makul hem baştaki ve sondaki çizgi, önlemek istiyorsanız, değiştirmek? – interstar

+1

Kontrol edilmedi, ancak belirtilen yerel ayarın alfa sayısal karakterleri eşleşmelidir. – Rozuur

19

Normal ifadeniz yalnızca bir karakterle eşleşir.

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

olarak ... kontrol değiştirebilir.

Bunu mu demek istediniz, yani sadece bir alt çizgilere izin verilir, toplam? (Oyuncu isimleri için mantıksız değil; özellikle bitişik alt çizgiler diğer oyuncuların okuması zor olabilir.) "A_b_c" eşleşmemeli mi?

Eğer öyleyse:

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

regex basitleştiren boş değeri, şartı çeklerin yeni ilk bölümü.

Bu, alt çizginin nerede olabileceği konusunda herhangi bir kısıtlama getirmez, bu nedenle "_a", "a_" ve "_" öğelerinin tümü eşleşecektir. LOCALE veya UNICODE

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