【发布时间】:2015-12-01 20:19:00
【问题描述】:
我正在尝试在 python 中创建一个小型文本限制程序。基本上,用户输入文本、一些过滤器(a 表示字母,n 表示数字等)。用户可以组合过滤器(a 和 n 用于字母数字等),但我偶然发现了这一点:
if re.match("[a-zA-Z]", textToRestrict):
return True
else:
return False
这就是事情分崩离析的地方。假设只有字母作为过滤器,程序将只接受字符串,例如dance。但是,如果 textToRestric 是 dance1234(不正确),if 语句仍然返回 true,而 1234dance 将返回 false(正确)。
相反,如果我通过[0-9] 测试数字,即使它包含字母字符,它仍会返回true,前提是这些字符不是第一个。
如何使用正则表达式仅匹配某种类型,并以这样的方式添加另一种类型(如类型字符串 + 类型数字)允许两种类型返回 true?
更新:这是我用于多个过滤器的方法:
regex = ""
if FilterClass.ALPHABETIC in arguments:
regex += "[a-zA-Z]"
if FilterClass.CAPITAL_ALPHABETIC in arguments:
regex += "[A-Z]"
if FilterClass.NUMERIC in arguments:
regex += "\d"
if FilterClass.SPECIAL_CHARACTERS in arguments:
regex += "[^0-9a-zA-Z]*"
if FilterClass.DASH_UNDERSCORES in arguments:
regex += "[-_]*"
regall = "^(" + regex + ")+$"
if re.match(regall, textToRestrict):
return True
else:
return False
arguments是用户输入的参数。 if 语句检查其中的内容,并且据说会向正则表达式字符串添加更多模式。
【问题讨论】:
-
为什么不使用
str.isalpha()和str.isdigit()? -
您的正则表达式不会在位置上检查它在字符串中的位置,并且不匹配超过第一个字符
^[a-zA-Z]+$从头到尾匹配的任何内容,一个或多个匹配出现的字母直到字符串的结尾。 -
@SirParselot,因为理想情况下,用户可以输入字母、数字、特殊字符或这些字符的任意组合,只要他们使用适当的过滤器。我不确定
isalpha()和isdigit()是否可以用于此目的。