Python中仅允许字母数字空格的正则校验失效问题求助
问题根因
你的校验逻辑存在两处明显问题,才会导致带特殊字符的字符串被误判为合法:
- Python的
re.match()方法只从字符串开头位置匹配规则,只要开头部分符合正则要求就会返回匹配对象,不会校验整个字符串的所有字符。你当前的正则没有加结尾锚定,所以类似chris test 1 %^&*这种开头合法、后半段带特殊字符的字符串,也会被re.match()判定为匹配成功。 - RegExr默认的匹配规则和Python
re.match()的默认行为不一致,所以才会出现两端测试结果不同的情况。
修复方案
可以任选其中一种方式修复:
方式1:补充正则锚点,沿用re.match()
给正则添加字符串开头、结尾锚定符,要求整个字符串的所有字符都符合规则才算匹配:
# 原正则修改为以下写法 pattern = re.compile(r'^[a-zA-Z0-9\s]+$')
其中^代表字符串起始位置,$代表字符串结束位置。
方式2:使用全匹配方法(Python 3.4+支持)
不需要修改正则,直接将match()替换为fullmatch()方法即可,该方法会自动要求整个字符串完全匹配正则规则:
pattern = re.compile(r'[a-zA-Z0-9\s]+') # 替换match为fullmatch if pattern.fullmatch(data['name']): print('it validated the pattern')
内容的提问来源于stack exchange,提问作者Christopher Jakob
相关产品推荐
相关产品推荐

