Python正则精确匹配:如何校验字符串长度为5-50字符?
解决正则匹配字符串长度范围的问题
哦,这个坑我之前踩过!你用的re.match('.{5,50}', my_string)之所以在字符串超过50字符时不返回None,核心原因是:re.match()只会从字符串的起始位置开始匹配,只要开头的5-50个字符符合规则,它就会返回匹配对象,完全不管字符串后面还有没有多余的内容。举个例子,要是你传一个60字符的字符串,它会匹配前50个字符,然后直接返回结果,根本不会检查剩下的10个字符。
正确的解决方案
要让正则校验整个字符串的长度,必须给正则表达式加上起始锚点^和结束锚点$,强制正则引擎检查从字符串开头到结尾的所有内容是否完全符合长度要求。这里有两种写法:
写法1:使用re.fullmatch()(更直观)
re.fullmatch()方法本身就等同于re.match('^pattern$'),专门用来匹配整个字符串,代码更简洁:
import re def is_length_valid(my_string): # 返回True表示长度在5-50之间,False则不符合 return re.fullmatch('.{5,50}', my_string) is not None
写法2:给re.match()加上锚点
如果你坚持要用re.match(),只需要给正则加上^和$即可:
import re def is_length_valid(my_string): return re.match('^.{5,50}$', my_string) is not None
额外说明:处理包含换行符的字符串
如果你的字符串里可能包含换行符(\n),默认情况下.是不匹配换行的,这时候需要加上re.DOTALL标志,让.匹配包括换行在内的所有字符:
re.fullmatch('.{5,50}', my_string, flags=re.DOTALL) is not None
更高效的替代方案(非正则)
其实如果只是单纯校验字符串长度,完全不需要用到正则,直接判断长度范围会更简单、性能也更好:
def is_length_valid(my_string): return 5 <= len(my_string) <= 50
当然,如果你的需求里除了长度还有其他正则校验规则(比如同时限制字符类型),那结合锚点的正则写法就非常合适。
内容的提问来源于stack exchange,提问作者ehsan shirzadi
相关产品推荐
相关产品推荐

