我是巨蟒的新手。我想写一个正则表达式来检查名字。
我的输入字符串可以包含a-z、a-z、0-9和“u”,但它应该以a-z或a-z开头(不是0-9和“u”)。我想为此编写一个正则表达式。我试过了,但没有什么能完美匹配。
一旦输入字符串遵循正则表达式规则,我就可以继续,否则就放弃该字符串。
最佳答案
以下是您问题的答案:
如果您希望_
(而不是-
),则应执行以下操作:
>>> 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
>>>
坚决抵制使用的诱惑,原因如下:
您好,您好,使用
$
是错误的,请使用$
代替>>> 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
说:
“$”
匹配字符串的结尾或字符串末尾[我的强调]的换行符之前,并且在多行模式下,也匹配换行符之前。foo同时匹配“foo”和“foobar”,而正则表达式foo$只匹配“foo”。更有趣的是,在“foo1 \foo2 \n”中搜索foo.$通常与“foo2”匹配,但在多行模式下搜索“foo1”;在“foo \n”中搜索单个$将找到两个(空)匹配项:一个位于换行符之前,一个位于字符串末尾。
和
\z
只在字符串的末尾匹配。
===现在完全不同了===
>>> 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
>>>