python:regex匹配字符串且仅匹配字符串

python:regex匹配字符串且仅匹配字符串,python,regex,string,Python,Regex,String,我正在尝试用python创建一个小的文本限制程序。基本上,用户输入文本,一些过滤器a表示字母,n表示数字,等等。。用户可以组合字母数字等的过滤器a和n,但我偶然发现: if re.match("[a-zA-Z]", textToRestrict): return True else: return False 这就是事情的分崩离析之处。据推测,如果只使用字母作为过滤器,程序将只接受字符串,例如dance。但是,如果textToRestric(例如dance1234)不正确,if

我正在尝试用python创建一个小的文本限制程序。基本上,用户输入文本,一些过滤器a表示字母,n表示数字,等等。。用户可以组合字母数字等的过滤器a和n,但我偶然发现:

if re.match("[a-zA-Z]", textToRestrict):
    return True
else:
    return False
这就是事情的分崩离析之处。据推测,如果只使用字母作为过滤器,程序将只接受字符串,例如dance。但是,如果textToRestric(例如dance1234)不正确,if语句仍然返回true,而1234dance将返回false correct

相反,如果我通过[0-9]测试数字,即使它包含字母字符,只要字符不是第一个,它仍然会返回true

我如何使用regex只匹配某个类型,并以这样的方式向其中添加另一个类型,如type string+type digit,允许这两种类型都返回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语句检查其中包含的内容,并假定向正则表达式字符串添加更多模式。

在正则表达式的两端添加,如果要排除空字符串,则添加一个量词+;*如果要允许空字符串。现在,您只需检查第一个单数字符是否符合字母顺序,即匹配[a-zA-Z]

你想要的是:

re.match("^[a-zA-Z]+$", textToRestrict)

或者,如果您的筛选器真的很简单,请考虑使用String ISAlPHa这样的字符串方法,.E/P>< P>在正则表达式的两端加上一个量词+,如果您想排除空字符串,*如果要允许空字符串。现在,您只需检查第一个单数字符是否符合字母顺序,即匹配[a-zA-Z]

你想要的是:

re.match("^[a-zA-Z]+$", textToRestrict)

或者,如果你的过滤器真的很简单,考虑使用像Str.ISAlPHa这样的字符串方法,./p>为什么不使用Str.IsAlgor和Str.IdDigy?你的正则表达式没有位置地检查它所在的字符串中的哪个位置,并且不匹配任何比第一个字符[[-ZA-Z] ++$匹配]从开始到结束的匹配。在一个或多个匹配的字母上,直到字符串结束。@sirpasselot,因为理想情况下,用户可以输入字母、数字、特殊字符或这些字符的任意组合,只要他们使用适当的过滤器。我不确定isalpha和isdigit是否可以用于此目的。为什么不使用str.isalpha和str.isdigit?您的正则表达式不会按位置检查它在字符串中的位置,并且只与第一个字符^[a-zA-Z]+$从头到尾匹配,在一个或多个匹配的字母上,直到字符串结束。@sirpasselot,因为理想情况下,用户可以输入字母、数字、特殊字符或这些字符的任意组合,只要他们使用适当的过滤器。我不确定isalpha和isdigit是否可以用于此。但是,如果您使用match进行测试,则不需要左锚。@Felk严格地说,您是对的-它不是。为了清楚起见,我还是想把它放在里面。这对一个人来说很有效,谢谢。如果将其视为字符串,我是否可以添加到该模式中,或者是否需要在最后加上+$?我已经更新了上面的帖子,以显示我目前如何清晰地做事。@zack_falcon+表示匹配我前面的东西1次或多次。$means与字符串的结尾匹配。如果你想匹配字母数字,如果你想使用正则表达式,你需要像^[0-9a-zA-Z]+$这样的东西。如果你想一块一块地构建这些正则表达式,你需要使用一个像[0-9]|[a-zA-Z]这样的替换,然后用^…+$包装它。管道不是一个or吗?这是否意味着它将检查是否有[0-9]或[a-zA-Z]直到结束?如果您使用match进行测试,则不需要左锚。@Felk严格地说,您是对的-它不是。为了清楚起见,我还是想把它放在里面。这对一个人来说很有效,谢谢。如果将其视为字符串,我是否可以添加到该模式中,或者是否需要在最后加上+$?我已经更新了上面的帖子,以显示我目前如何清晰地做事。@zack_falcon+表示匹配我前面的东西1次或多次。$means与字符串的结尾匹配。如果你想匹配字母数字,如果你想使用正则表达式,你需要像^[0-9a-zA-Z]+$这样的东西。如果你想一块一块地构建这些正则表达式,你需要使用一个像[0-9]|[a-zA-Z]这样的替换,然后用^…+$包装它。管道不是一个or吗?这是否意味着它将检查是否存在[0-9]或[a-zA-Z],直到结束?