Dưới đây là một câu trả lời cho câu hỏi của bạn:
Giải thích mà bạn muốn _
(không -
), điều này sẽ thực hiện công việc:
>>> 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
>>>
Stoutly cưỡng lại sự cám dỗ để sử dụng $
; đây là lý do:
Xin chào, xin chào, sử dụng $
là sai, sử dụng \Z
thay
>>> 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 nói:
'$'
Trận cuối của chuỗi hoặc ngay trước khi dòng mới ở cuối chuỗi [nhấn mạnh của tôi] và trong chế độ MULTILINE cũng khớp với một dòng mới. foo khớp với cả ‘foo’ và ‘foobar’, trong khi cụm từ thông dụng foo $ chỉ khớp với ‘foo’. Thú vị hơn, tìm kiếm foo. $ Trong 'foo1 \ nfoo2 \ n' khớp với ‘foo2’ bình thường, nhưng ‘foo1’ ở chế độ MULTILINE; tìm kiếm một $ duy nhất trong 'foo \ n' sẽ tìm thấy hai kết quả phù hợp (trống): một ở ngay trước dòng mới và một ở cuối chuỗi.
và
\ Z
Matches chỉ ở phần cuối của chuỗi.
=== Và bây giờ cho một cái gì đó hoàn toàn khác nhau ===
>>> 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
>>>
là chuỗi rỗng được phép? – Svante
Bây giờ nó là gì, '-' hoặc' _'? – Svante
chuỗi rỗng không được phép. "_" đây là dấu gạch ngang không gạch ngang – user279315