Python正则表达式如何排除@符号?仅允许指定合法字符
问题
我希望字符串仅允许包含字母数字及少量特殊字符(+、-、_、空格),但使用当前Python正则表达式时,发现@和.(点)也被允许通过校验。调用以下代码传入'abc @'时,输出结果为'Name is valid',请问该如何修改正则表达式以排除@符号?
原代码:
import re def isInvalid(name): is_valid_char = bool(re.match('[a-zA-Z0-9+-_\s]+$', name)) if not is_valid_char: print('Name has invalid characters') else: print('Name is valid') isInvalid('abc @')
问题原因
你写的正则表达式[a-zA-Z0-9+-_\s]+$存在语法问题:字符集中的-放在+和_之间时,会被解析为范围运算符,匹配ASCII码从+(ASCII 43)到_(ASCII 95)之间的所有字符。而@(ASCII 64)和.(ASCII 46)正好处于这个范围内,所以会被误判为合法字符。
解决方案
把-放在字符集的开头或末尾,让它被当作普通字符匹配,而非范围运算符。或者给-添加转义符\-。推荐使用原始字符串r''来避免Python的转义干扰。
修改后的代码示例:
import re def isInvalid(name): # 将-放在字符集末尾,避免范围解析 is_valid_char = bool(re.match(r'[a-zA-Z0-9+_\s-]+$', name)) if not is_valid_char: print('Name has invalid characters') else: print('Name is valid') isInvalid('abc @') # 输出:Name has invalid characters isInvalid('abc +-_ ') # 输出:Name is valid
也可以选择将-放在字符集开头:
re.match(r'[-a-zA-Z0-9+_\s]+$', name)
或者用转义符:
re.match(r'[a-zA-Z0-9+\-_\\s]+$', name)
内容的提问来源于stack exchange,提问作者Optimus Prime
相关产品推荐
相关产品推荐

