2010-03-25 14 views
5

Ho cercato e cercato e non sono riuscito a trovare ciò di cui avevo bisogno, anche se penso che dovrebbe essere semplice (se avete qualche esperienza in Python, cosa che non faccio).Codice Python per utilizzare un'espressione regolare per assicurarsi che una stringa sia alfanumerica più. - _

Data una stringa, voglio verificare, in Python, che contiene solo i caratteri alfanumerici: a-zA-Z0-9 e ._-

esempi:

accettati:

bill-gates

Steve_Jobs

Micro.soft

Respinti:

Bill gates - senza spazi consentiti

[email protected] - @ non è alfanumerico

Sto cercando di usare:

if re.match("^[a-zA-Z0-9_.-]+$", username) == True:

Ma quello non sembra fare il lavoro ...

+3

re.match() non restituisce un valore booleano, viene restituito un [MatchObject] (http://docs.python.org/ library/re.html # re.match), che "ha sempre un valore booleano True" o None. –

+0

È sempre brutto usare '== True'. È al massimo ridondante e in un caso come questo, non funziona. –

+2

Considerate veramente (ad esempio) '---.___' per essere una corrispondenza valida? –

risposta

15

re.match non restituisce un valore booleano; restituisce un MatchObject in una partita o None in una partita non corrispondente.

>>> re.match("^[a-zA-Z0-9_.-]+$", "hello") 
<_sre.SRE_Match object at 0xb7600250> 
>>> re.match("^[a-zA-Z0-9_.-]+$", " ") 
>>> print re.match("^[a-zA-Z0-9_.-]+$", " ") 
None 

Quindi, non si dovrebbe fare re.match(...) == True; piuttosto, dovresti controllare re.match(...) is not None in questo caso, che può essere ulteriormente ridotto a solo if re.match(...).

3

Non utilizzare mai == True o == False in un confronto. Molti tipi già hanno un bool equivalente che si dovrebbe usare invece:

if re.match("^[a-zA-Z0-9_.-]+$", username): 
2

potrebbe anche accorciare leggermente per:

if re.match(r'^[\w.-]+$', username): 
0

Se avete intenzione di utilizzare molte espressioni regolari è possibile compilarlo per la velocità (o leggibilità)

import re 
ALPHANUM=re.compile('^[a-zA-Z0-9_.-]+$') 

for u in users: 
    if ALPHANUM.match(u) is None: 
     print "invalid" 

Da the docs:

Le versioni compilate dei pattern più recenti passati a re.match(), re.search() o re.compile() vengono memorizzati nella cache, quindi i programmi che utilizzano solo alcune espressioni regolari alla volta non devono preoccuparsi di compilare le espressioni regolari.

0

faccio del mio convalida in questo modo nella mia classe utils:

def valid_re(self, s, r): 
reg = re.compile(r) 
return reg.match(s) 

Poi chiamo l'istanza utils, e controllare in questo modo:

if not utils.valid_re(username, r'^[a-zA-Z0-9_.-]+$'): 
     error = "Invalid username!" 
0

Vorrei prendere in considerazione questo per nome utente valido:
1) Il nome utente deve essere 6-30 caratteri lunghi
2) Il nome utente può contenere solo:

  • lettere maiuscole e minuscole
  • numeri da 0-9 e
  • Caratteri speciali _ -.

3) Nome utente non può:

  • Iniziare o terminare con caratteri _ -.

  • Hanno più di un carattere sequenziale _ -. all'interno

Questo sarebbe esempio di utilizzo:
if re.match(r'^(?![-._])(?!.*[_.-]{2})[\w.-]{6,30}(?<![-._])$',username) is not None:

Problemi correlati