-1

美好的一天stackoverflow,我的程序有问题。我想测试我输入的字符串是否是字母数字。

def logUtb(fl, str):
now = datetime.datetime.now()
  fl.write(now.strftime('%Y-%m-%d %H:%M') + " - " + str + "\n");
  return;

#Test alphanumeric
def testValidationAlphaNum():
    valid = re.match('[A-Za-z0-9]', '!@#@$@$@')
    if valid == True:
        logUtb(f, 'Alphanumeric')
    else:
        logUtb(f, 'Unknown characters')

如您所见,我输入了 '!@#@$@$@' 以通过我的正则表达式模式进行测试。它不是将“未知字符”返回到我的报告日志,而是返回字母数字。你们能告诉我我的程序似乎有什么问题吗?谢谢!

4

3 回答 3

4

re.match()None如果字符串不匹配则返回,如果匹配则返回MatchObject。所以== True测试永远不会满足。如果您真的看到了'Alphanumeric'输出,那么这不是您发布的代码的结果。

在任何情况下,您都应该str.isalnum()为此使用:

>>> 'abc'.isalnum()
True
于 2013-09-20T02:26:29.130 回答
0
valid = re.match('[A-Za-z0-9]', '!@#@$@$@')

可能

valid = re.match(r'^\w*$', '!@#@$@$@')

和工作。\w是字母数字。(根据python,我想补充一点,下划线是字母数字。)所以如果你不想要那些,你的正则表达式应该是:^[A-Za-z0-9]*$

或者,它可以[^_/W]

if valid == True必须要if valid上班。

于 2013-09-20T02:40:59.033 回答
0

我同意其他人所说的调用 str.isalnum() 将是一个更简单的选择。

但是,我想就您尝试的正则表达式模式指出一些事情。就像亚历克斯鲍德温说的那样,你的模式只会在字符串的开头寻找一个字母数字。因此,您可能在字符串的其余部分中还有其他任何内容,并且仍然可以匹配。

您应该做的是量化您的字符类,并将该类锚定到字符串的末尾。要测试字符串是否包含一些字母数字,您应该选择 + 量词,它会查找至少一个字母数字。确保您使用 $ 将模式锚定到字符串的末尾,否则您可能会在末尾潜入一些非字母数字:

re.match('[A-Za-z0-9]+$', '!@#@$@$@')

当然,对于给定的字符串,这将返回 false。在这里使用 * 的问题是,即使针对空字符串,它也会返回 MatchObject,并且我假设您希望至少存在一个字母数字字符。另请注意,不需要使用 ^ 将字符类锚定到字符串的开头,因为 re.match() 仅在字符串的开头开始搜索。然后你想用你的条件来测试一个 MatchObject 是否由 re.match() 返回:

valid = re.match('[A-Za-z0-9]+$', '!@#@$@$@')
    if valid:
        logUtb(f, 'Alphanumeric')
    else:
        logUtb(f, 'Unknown characters')

有关量词和锚的其他信息可以在文档中找到:

http://docs.python.org/2/library/re.html

于 2013-09-21T14:03:51.253 回答