我是Python的新手。我想为一些名称检查编写正则表达式。 我的输入字符串可以包含a-z,A-Z,0-9和'_',但它应该以a-z或A-Z(不是0-9和'_')开头。我想为此写一个正则表达式。我试过了,但没有什么能完美搭配。
一旦输入字符串遵循正则表达式规则,我就可以继续进行,否则丢弃该字符串。
答案 0 :(得分:6)
以下是您的问题的答案:
解释您想要_
(而非-
),这应该可以胜任:
>>> 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
>>>
坚决抵制使用$
的诱惑;这就是原因:
您好,您好,使用$
错误,请改用<{1}}
\Z
'$'
匹配字符串的结尾或恰好在字符串末尾的换行符之前 [我的强调],并且在MULTILINE模式下也匹配换行符之前。 foo匹配'foo'和'foobar',而正则表达式foo $只匹配'foo'。更有趣的是,在'foo1 \ nfoo2 \ n'中搜索foo。$'正常匹配'foo2',但在MULTILINE模式下匹配'foo1';在'foo \ n'中搜索单个$将找到两个(空)匹配:一个在换行符之前,一个在换行符的末尾。
和
\ž
仅匹配字符串末尾的匹配。
===现在有一些完全不同的东西===
>>> 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
答案 1 :(得分:4)
>>> 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
Note2 :如果您不希望匹配字符串以\n
结尾,则可以使用\Z
代替$
,如John Machin所述。
答案 2 :(得分:-1)
这是一个非常重要的方式
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