美好的一天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')
正如你所看到的,我输入'!@#@ $ @ $ @'以我的正则表达式模式进行测试。而不是将“未知字符”返回到我的报告日志,它返回字母数字。你能告诉我我的程序有什么问题吗?谢谢!
答案 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')
有关量词和锚点的更多信息,请参阅文档: