Oto odpowiedź na pytanie:
wykładni tego chcesz _
(nie -
), to powinno załatwić sprawę:
>>> 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
>>>
stanowczo oprzeć się pokusie korzystania $
; oto dlaczego:
Halo, halo, używając $
jest źle, używać \Z
zamiast
>>> 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 mówi:
'$'
Dopasowuje koniec łańcucha lub tuż przed znak nowej linii na końcu ciągu znaków [mój nacisk], aw trybie MULTILINE również dopasowuje przed znakiem nowej linii. foo dopasowuje zarówno "foo", jak i "foobar", podczas gdy wyrażenie regularne foo $ dopasowuje tylko "foo". Co ciekawsze, szukanie foo. $ W 'foo1 \ nfoo2 \ n' dopasowuje 'foo2' normalnie, ale 'foo1' w trybie MULTILINE; poszukiwanie pojedynczego $ in 'foo \ n' znajdzie dwa (puste) dopasowania: jeden tuż przed znakiem nowej linii i jeden na końcu łańcucha.
i
\ Z
Mecze tylko na końcu łańcucha.
=== A teraz coś z zupełnie innej beczki ===
>>> 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
>>>
jest pusty ciąg być dozwolone? – Svante
Który to teraz, '-' lub' _'? – Svante
pusty ciąg znaków nie może być dozwolony. "_" to nie jest myślnik – user279315