2011-01-18 21 views
13

Estoy buscando coincidir con una cadena que se ingresa desde un sitio web para comprobar si es alfanumérico y posiblemente contenga un guión bajo. Mi código:Python: la expresión regular para que coincida con alfanumérico no funciona?

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

Para alguna razón, esto coincide con caracteres locos por ejemplo: NIG ○ ▲ ☆ ★ ◇ ◆

sólo quiero AZ 0-9 y regulares _ y coincidente, ¿hay algo me falta aquí?

Respuesta

25

Python tiene una secuencia especial \w para hacer coincidir alfanuméricos y subrayados cuando no se especifican las banderas LOCALE y UNICODE. Para que pueda modificar su patrón que,

pattern = '^\w+$'

+3

¿Qué pasa si LOCALE o Unicode se especifican? – interstar

+1

No se ha comprobado, pero debe coincidir con los caracteres alfanuméricos de la configuración regional especificada. – Rozuur

19

Su expresión regular solo coincide con un caracter. Tal vez puedas probar:

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

... comprobar si es alfanumérico y posiblemente contiene un carácter de subrayado.

¿Te refieres a esto literalmente, de modo que solo se permite un guión bajo, total? (No es irracional para los nombres de los jugadores, los subrayados adyacentes en particular pueden ser difíciles de leer para otros jugadores). ¿No debería coincidir "a_b_c"?

Si es así:

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

La nueva primera parte de la condición cheques por un valor vacío, lo que simplifica la expresión regular.

Esto no tiene restricciones sobre dónde puede aparecer el guión bajo, por lo que todos los "_a", "a_" y "_" coincidirán. Si por el contrario desea evitar que ambos anterior y posterior guiones, lo que es más razonable para nombres de los jugadores, cambiar 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 
Cuestiones relacionadas