You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 20:50:26