python正则表达式模式无法正常工作

时间:2013-09-20 02:23:39

标签: python regex

美好的一天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')

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

3 个答案:

答案 0 :(得分:4)

如果字符串不匹配,则

re.match()会返回None,如果匹配则返回MatchObject。因此永远不会满足== True测试。如果你真的看到'Alphanumeric'输出,那么它不是你发布的代码的结果。

无论如何,您应该使用str.isalnum()

>>> 'abc'.isalnum()
True

答案 1 :(得分: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才能正常工作。

答案 2 :(得分:0)

我同意其他人说过在这里调用str.isalnum()会更简单。

但是,我想指出一些关于你试过的正则表达式的事情。就像Alex Baldwin所说的那样,你的模式只会在字符串的开头找一个单独的字母数字。所以,你可能在字符串的其余部分中还有其他东西,但仍然可以匹配。

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

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

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

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