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
>>>
se ha de permitir una re no forma la cadena vacía? – Svante
¿Qué es ahora, '-' o' _'? – Svante
cadena vacía no se puede permitir. "_" esto es hypen not dash – user279315