pandas.Series.str.contains无法匹配[a-zA-Z]全角字母,如何过滤含字母的行?
问题原因
你遇到的残留行包含的是全角英文字母,这类字符是中文排版场景下的特殊格式字符,每个字符占一个全角汉字的宽度,其Unicode编码和常规半角英文字母不在同一区间,因此原来仅匹配半角a-zA-Z的正则无法识别这类字符,不属于编码错误问题。
解决方案
方案1:直接扩展正则匹配范围
在正则中同时加入全角英文字母的匹配区间即可,代码如下:
# 写法1:直接写入全角字母范围 df = df[~df['tag_name'].str.contains(r"[a-zA-ZA-Za-z]", na=False)] # 写法2:使用Unicode编码范围,兼容性更强 df = df[~df['tag_name'].str.contains(r"[a-zA-Z\uFF21-\uFF3A\uFF41-\uFF5A]", na=False)]
其中na=False用于处理字段为空的行,避免空值返回NaN导致过滤逻辑出错。
方案2:先统一转换全角为半角再过滤
如果后续还有其他字符处理需求,可以先把所有全角字符转换为半角,再执行原有过滤逻辑,避免后续再出现全角半角不一致的问题:
def full_to_half(text: str) -> str: result = [] for char in text: ord_char = ord(char) # 全角空格单独处理 if ord_char == 0x3000: result.append(chr(0x20)) # 其他全角字符转半角 elif 0xFF01 <= ord_char <= 0xFF5E: result.append(chr(ord_char - 0xFEE0)) else: result.append(char) return ''.join(result) # 全角转半角后执行过滤 df['tag_name'] = df['tag_name'].apply(full_to_half) df = df[~df['tag_name'].str.contains("[a-zA-Z]", na=False)]
内容的提问来源于stack exchange,提问作者Sheng
相关产品推荐
相关产品推荐

