使用正则匹配替换pandas列值时函数仅返回None该如何解决?
错误排查与修复方案
存在的问题
- 语法错误:
re.search调用行末尾多了1个多余的右括号,会直接触发语法错误,若运行时忽略了报错,函数会默认返回None,是导致全列返回None的核心原因。 - 正则逻辑错误:模式中
(.*)(Dresden(\.|,|\s+)?)?段的.*为贪婪匹配,会吞噬字符串后续所有内容,导致末尾的Dresden相关规则永远无法命中,进一步降低匹配成功率。 - 字符匹配风险:正则中同时匹配普通
i和土耳其语无点字符ı,如果你的数据源不存在土耳其语字符、或字符串编码异常,会导致d(i|ı)e、Staatsreg(i|ı)erung两段匹配失败。
修复后代码
import re def override(s): # 修正多余括号、将贪婪匹配改为非贪婪匹配.*?,末尾加$锚定结尾提升匹配准确性 x = re.search( r'(an|frage(\s+ich)?)\s+d(i|ı)e\s+Staatsreg(i|ı)erung(.*?)(Dresden(\.|,|\s+)?)?$', str(s), flags=re.DOTALL | re.MULTILINE ) return x.group(5) if x else None df2['que_text_new'] = df2['que_text'].apply(override)
验证建议
你可以先取单条样本单独测试匹配结果,确认逻辑符合预期:
# 取第一条样本测试 test_str = df2['que_text'].iloc[0] print(re.search(r'(an|frage(\s+ich)?)\s+d(i|ı)e\s+Staatsreg(i|ı)erung(.*?)(Dresden(\.|,|\s+)?)?$', str(test_str), flags=re.DOTALL | re.MULTILINE))
内容的提问来源于stack exchange,提问作者id345678
相关产品推荐
相关产品推荐

