Pandas str.extract方法匹配公司法律术语无结果问题咨询
Pandas str.extract无匹配结果问题排查与修复
核心错误原因
- 正则语法不兼容:Pandas字符串方法基于Python
re模块实现,不支持JavaScript风格的/正则表达式/修饰符写法。你写的/(2&0|Technologies|Inc)/ig会被识别为需要匹配以/开头、以/ig结尾的内容,而legal表中的所有术语都不包含这些字符,自然全部返回NaN。大小写忽略的需求需要通过flags参数传入re.IGNORECASE实现,不能直接写在正则字符串末尾。 - 正则特殊字符未转义:legal表中存在
s.a.、GmbH & Co. KGaA这类包含.、&等正则特殊字符的术语,如果不做转义处理,特殊字符会触发正则语义导致匹配异常。 - 匹配逻辑可优化:你当前的逻辑是遍历每家公司、拆分公司名做正则再去匹配legal表,性能较低。更合理的逻辑是提前把legal表的所有术语拼成正则,直接批量匹配companies表的公司名字段。
修复后代码示例
import re import pandas as pd def format_companies(self, legals, locations): # 初始化字段 self.companies[['base_name', 'location', 'legal']] = '' # 转义legal术语中的特殊字符,拼接为正则捕获组 legal_term_list = legals['legal'].apply(re.escape).tolist() legal_pattern = rf'({"|".join(legal_term_list)})' # 批量匹配所有公司名中的法律术语,开启忽略大小写配置 self.companies['legal'] = self.companies['raw'].str.extract( legal_pattern, flags=re.IGNORECASE, expand=False )
如果你需要保留原有遍历逻辑,仅修改正则相关代码即可:
# 替换原有正则构造部分 legal_pattern = rf'({"|".join(map(re.escape, row["raw"].split()))})' # 传入忽略大小写参数 legal = legals['legal'].str.extract(legal_pattern, flags=re.IGNORECASE, expand=False) # 提取匹配到的术语 matched_legal = legal.dropna().iloc[0] if not legal.isna().all() else ''
内容的提问来源于stack exchange,提问作者giulio di zio
相关产品推荐
相关产品推荐

