python正则表达式模式工作不正常

2024-04-26 11:32:08 发布

您现在位置:Python中文网/ 问答频道 /正文

你好,我的程序有问题。我想测试我输入的字符串是否是字母数字。你知道吗

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')

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


Tags: 字符串test程序datetimereturndef字母数字
3条回答
valid = re.match('[A-Za-z0-9]', '!@#@$@$@')

可能是

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

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

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

但是if valid == True必须是if valid才能工作。你知道吗

^{}如果字符串不匹配,则返回None;如果匹配,则返回MatchObject。所以== True测试永远不会满足。如果您真的看到了'Alphanumeric'输出,那么这不是您发布的代码的结果。你知道吗

在任何情况下,都应该使用^{}来表示:

>>> 'abc'.isalnum()
True

我同意其他人所说的板蓝根()将是一个更简单的选择。你知道吗

不过,我想指出一些关于您尝试的regex模式的事情。正如alexbaldwin所说,你的模式只会在字符串的开头寻找一个字母数字。因此,在字符串的其余部分可能还有其他内容,但仍然可以得到匹配项。你知道吗

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

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

当然,对于给定的字符串,这将返回false。在这里使用*的问题是,即使是针对空字符串,它也会返回MatchObject,我假设您希望至少存在一个字母数字字符。另外请注意,不需要使用“^”将字符类锚定到字符串的开头,因为重新匹配()只在字符串的开头开始搜索。然后要用条件测试的是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

相关问题 更多 >