Python-如何使用re匹配整个字符串

37

我正在验证用户输入的文本,以便仅接受字母而不是数字。到目前为止,当我输入一个数字(例如56)时,我的代码可以正常工作,它会警告我只能输入字母,当我输入字母时它不返回任何东西(就像它应该做的那样)。我的问题是,当我先输入字母然后跟着数字时,它会接受它,例如(s45),它会接受第一个字母但不是整个字符串。我需要它接受整个字符串。

def letterCheck(aString):
    if len(aString) > 0:
        if re.match("[a-zA-Z]", aString) != None:
            return ""
    return "Enter letters only"

你返回了空值,请尝试在你的正则表达式末尾添加“+”。 - squiguy
不,返回部分没问题。如果它通过验证测试,则意味着不返回任何内容。 - Thomas
3
为什么不直接使用aString.isalpha() - kindall
2
这不是问题,但在我看来,这是相当糟糕的设计;如果必要的话,在调用代码中返回布尔值并打印错误消息... - Wooble
问题标题有误导性,解决方案是针对所描述的问题,而不是如何匹配整个字符串。 - kiril
4个回答

65

将其锚定到开头和结尾,并匹配一个或多个字符:

if re.match("^[a-zA-Z]+$", aString):

这里的^锚定在字符串的开头,$锚定在字符串的结尾,而+确保匹配1个或多个字符。

不过,你最好直接使用str.isalpha()。在这里没有必要使用复杂的正则表达式:

>>> 'foobar'.isalpha()
True
>>> 'foobar42'.isalpha()
False
>>> ''.isalpha()
False

3
你需要用 re.match 和 ^ 吗?这不是默认情况吗? - user
4
是的,这是暗示;但我更喜欢显式锚点,因为你绝对需要 $,而且太多人在 re.search()re.match() 之间会被细微差别绊倒。 - Martijn Pieters
@MartijnPieters:那是一个好建议。我无法从文档中推断出使用re.match加上^是否会产生任何副作用。 - user

5
使用正则表达式和原始字符串来编码正则表达式,例如这样:

使用边界在您的正则表达式+原始字符串中,像这样:

r"^[a-zA-Z]+$"

3
您可以考虑在字符串上使用isalpha()。如果该字符串仅包含字母,则它返回true,否则返回false。
if aString.isalpha():
   do something
else:
   handle input error

isalpha() 在这个应用中的一个好处是,它对于空字符串返回 False,因此不再需要单独测试。 - kindall
谢谢大家的快速回答,它们都帮助我解决了这个问题。 - Thomas

0
如果你在寻找漂亮的 Python 代码,可以使用 isalpha 和 isdecimal:
str = u"23443434";
print str.isdecimal();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接