2010-03-25 12 views
5

Miré y busqué y no pude encontrar lo que necesitaba, aunque creo que debería ser simple (si tiene alguna experiencia en Python, que yo no).Código de Python para usar una expresión regular para asegurarse de que una cadena sea alfanumérica plus. - _

Dada una cadena, que desea verificar, en Python, que contiene sólo caracteres alfanuméricos: a-zA-Z0-9 y ._-

ejemplos:

aceptado:

bill-gates

Steve_Jobs

Micro.soft

rechazadas:

Bill gates - no se permiten espacios

[email protected] - @ no es alfanumérico

Estoy tratando de utilizar:

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

Pero eso no parece hacer el trabajo ...

+3

re.match() no devuelve un valor booleano, devuelve un [MatchObject] (http://docs.python.org/ library/re.html # re.match), que "siempre tiene un valor booleano True" o None. –

+0

Siempre es malo usar '== True'. En el mejor de los casos es redundante y en un caso como este, simplemente no funciona. –

+2

¿Realmente considera (por ejemplo) '---.___' como una coincidencia válida? –

Respuesta

15

re.match no devuelve un valor booleano; devuelve MatchObject en una coincidencia o None en una coincidencia.

>>> 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 

Por lo tanto, no debe hacer re.match(...) == True; más bien, debería verificar re.match(...) is not None en este caso, que puede acortarse aún más a solo if re.match(...).

3

Nunca use == True o == False en una comparación. Muchos tipos ya tienen un equivalente bool que se debe utilizar en su lugar:

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

también podría acortar ligeramente para:

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

Si se va a utilizar muchas expresiones regulares se puede compilar para la velocidad (o la legibilidad)

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

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

De the docs:

Las versiones compiladas de los patrones más recientes pasados ​​a re.match(), re.search() o re.compile() se almacenan en caché, por lo que los programas que usan solo algunas expresiones regulares a la vez no necesitan preocuparse por la compilación de expresiones regulares.

0

hago mi validación de esta manera en mi clase de utilidades:

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

Entonces me llaman la instancia utils, y comprobar de esta manera:

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

Me parece que es para el nombre de usuario válido:
1) El nombre de usuario debe ser de 6-30 caracteres de largo
2) El nombre de usuario solo puede contener:

  • letras mayúsculas y minúsculas
  • números del 0-9 y
  • caracteres especiales _ -.

3) Nombre de usuario no puede:

  • Comenzar o terminar con caracteres _ -.

  • Tiene más de un carácter de secuencia _ -. dentro

Esto sería ejemplo de uso:
if re.match(r'^(?![-._])(?!.*[_.-]{2})[\w.-]{6,30}(?<![-._])$',username) is not None:

Cuestiones relacionadas