我是Python的新手。我想写一个正则表达式来进行一些名称检查。 我的输入字符串可以包含a-z,A-Z,0-9和'_',但它应该以a-z或A-Z(不是0-9和'_')开头。我想为此写一个正则表达式。我试过了,但没有任何东西完美匹配。如何使用正则表达式来匹配名称?
一旦输入字符串遵循正则表达式规则,我可以继续进行,否则放弃该字符串。
我是Python的新手。我想写一个正则表达式来进行一些名称检查。 我的输入字符串可以包含a-z,A-Z,0-9和'_',但它应该以a-z或A-Z(不是0-9和'_')开头。我想为此写一个正则表达式。我试过了,但没有任何东西完美匹配。如何使用正则表达式来匹配名称?
一旦输入字符串遵循正则表达式规则,我可以继续进行,否则放弃该字符串。
>>> 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")
>>>
注意:OP提到string cannot start from (0-9 and "_").
,显然_可以在文本。这就是为什么我使用\w
注2:如果你不想匹配的字符串与\n
结束呢,你可以使用\Z
代替$
如约翰·马金提及。
'[a-zA-Z] [\ w - ] * $' 这个正则表达式是错误的,因为它会匹配以任何东西开头的字符串。尽管如此,刚开始时只需要一个旋律。 – Mikuso 2010-02-23 10:05:47
@Mikuso,'re.match()'只匹配字符串的开头。 '重。search()'需要插入符号 – 2010-02-23 10:29:50
错误;它匹配“A \ n” – 2010-02-23 12:57:15
这里有一个回答你的问题:
解释要_
(不-
),这应该做的工作:
>>> 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
>>>
坚决抵制使用$
的诱惑;这里的原因:
你好,你好,使用$
是错误的,使用\Z
代替
>>> 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
'$'
匹配字符串或之前结束字符串 [我的重点]的结尾处的换行符以及MULTILINE模式中的换行符也在换行符前匹配。 foo匹配'foo'和'foobar',而正则表达式foo $只匹配'foo'。更有趣的是,在'foo1 \ nfoo2 \ n'中搜索foo。$通常与'foo2'匹配,而在MULTILINE模式下搜索'foo1'在'foo \ n'中搜索单个$将会找到两个(空)匹配:一个位于换行符之前,另一个位于字符串末尾。
和
\ž
仅匹配字符串的结尾。
===现在完全不同的东西===
>>> 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
>>>
这里的非重方式
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
(1)提问者没有说他想要依赖于区域的结果;他说他想要[a-zA-Z],所以如果输入是“”,则使用string.ascii_letters(2)崩溃(3) – 2010-02-23 15:04:56
是允许空字符串? – Svante 2010-02-23 10:11:27
现在是什么,'-'或'_'? – Svante 2010-02-23 10:14:07
空字符串不能被允许。 “_”这不是破折号 – user279315 2010-02-23 10:21:30