2010-02-23 23 views
5

Soy un novato en Python. Quiero escribir una expresión regular para verificar algunos nombres. Mi cadena de entrada puede contener a-z, A-Z, 0-9 y '_', pero debería comenzar con a-z o A-Z (no con 0-9 y '_'). Quiero escribir una expresión regular para esto. Lo intenté, pero nada encajaba perfectamente.¿Cómo uso una expresión regular para que coincida con un nombre?

Una vez que la cadena de entrada sigue las reglas de expresión regular, puedo seguir adelante, de lo contrario descartar esa cadena.

+0

se ha de permitir una re no forma la cadena vacía? – Svante

+1

¿Qué es ahora, '-' o' _'? – Svante

+0

cadena vacía no se puede permitir. "_" esto es hypen not dash – user279315

Respuesta

4
>>> import re 

>>> re.match("[a-zA-Z][\w-]*$","A") 
<_sre.SRE_Match object at 0x00932E20> 

>>> re.match("[a-zA-Z][\w-]*$","A_B") 
<_sre.SRE_Match object at 0x008CA950> 

>>> re.match("[a-zA-Z][\w-]*$","0A") 
>>> 
>>> re.match("[a-zA-Z][\w-]*$","!A_B") 
>>> 

Nota: OP mencionó string cannot start from (0-9 and "_")., al parecer _ puede ser en el texto. Es por eso que estoy usando \w

Nota 2: Si no desea cadena de búsqueda termina con \n, se puede utilizar en lugar de \Z$ como se mencionó John Machin.

+0

'[a-zA-Z] [\ w -] * $' Esta expresión regular es incorrecta ya que coincidirá con una cadena que comienza con cualquier cosa. Casi allí, sin embargo, solo necesita un circunflejo al principio. – Mikuso

+2

@Mikuso, 're.match()' solo coincide desde el inicio de la cadena. 're.search() 'necesitaría el cursor –

+0

Incorrecto; coincide con "A \ n" –

5

Aquí es una respuesta a su pregunta:

Interpretación que desea _ (no -), esto debería hacer el trabajo:

>>> tests = ["a", "A", "a1", "a_1", "1a", "_a", "a\n", "", "z_"] 
>>> for test in tests: 
... print repr(test), bool(re.match(r"[A-Za-z]\w*\Z", test)) 
... 
'a' True 
'A' True 
'a1' True 
'a_1' True 
'1a' False 
'_a' False 
'a\n' False 
'' False 
'z_' True 
>>> 

resisten tenazmente a la tentación de utilizar $; he aquí por qué:

Hola, hola, utilizando $ está mal, utilizar \Z lugar

>>> re.match(r"[a-zA-Z][\w-]*$","A") 
<_sre.SRE_Match object at 0x00BAFE90> 
>>> re.match(r"[a-zA-Z][\w-]*$","A\n") 
<_sre.SRE_Match object at 0x00BAFF70> # WRONG; SHOULDN'T MATCH 
>>> 

>>> re.match(r"[a-zA-Z][\w-]*\Z","A") 
<_sre.SRE_Match object at 0x00BAFE90> 
>>> re.match(r"[a-zA-Z][\w-]*\Z","A\n") 
>>> # CORRECT: NO MATCH 

The Fine Manual dice:

'$'
coincide con el final de la cadena o justo antes la nueva línea al final de la cadena [énfasis mío], y en el modo MULTILINE también coincide antes de una nueva línea. foo coincide con 'foo' y 'foobar', mientras que la expresión regular foo $ solo coincide con 'foo'. Más interesante aún, la búsqueda de foo. $ En 'foo1 \ nfoo2 \ n' coincide con 'foo2' normalmente, pero 'foo1' en modo MULTILINEO; la búsqueda de un único $ en 'foo \ n' encontrará dos coincidencias (vacías): una justo antes de la nueva línea y una al final de la cadena.

y

\ Z
Partidos sólo al final de la cadena.

=== Y ahora algo completamente diferente ===

>>> import string 
>>> letters = set(string.ascii_letters) 
>>> ok_chars = letters | set(string.digits + "_") 
>>> 
>>> def is_valid_name(strg): 
...  return strg and strg[0] in letters and all(c in ok_chars for c in strg) 
... 
>>> for test in tests: 
...  print repr(test), repr(is_valid_name(test)) 
... 
'a' True 
'A' True 
'a1' True 
'a_1' True 
'1a' False 
'_a' False 
'a\n' False 
'' '' 
'z_' True 
>>> 
-1

aquí está

import string 
flag=0 
mystring="abcadsf123" 
if not mystring[0] in string.digits+"_": 
    for c in mystring: 
     if not c in string.letters+string.digits+"-": 
      flag=1 
    if flag: print "%s not ok" % mystring 
    else: print "%s ok" % mystring 
else: print "%s starts with digits or _" % mystring 
+0

(1) El interlocutor no dijo que deseaba resultados dependientes de la configuración regional; dijo que quería [a-zA-Z], así que use string.ascii_letters (2) cuelga si la entrada es "" (3) lo de la bandera es horrible –

Cuestiones relacionadas