Jupyter Notebook中Regex大小写敏感标识(?-i)失效问题求助
问题解决:Python Pandas中提取公司名称的正则报错
报错原因
你使用的正则表达式中的(?-i)是PCRE引擎支持的内联大小写修饰符,但Python的re引擎(Pandas字符串方法默认使用该引擎)对该语法兼容性存在问题,尤其是未全局开启忽略大小写匹配的场景下,该修饰符属于冗余内容且可能导致解析错误。
修改后的正则表达式
移除原正则中的(?-i),调整后的正则为:
\b(?:[A-Z][a-zA-Z()\.]*)(?:\s[A-Z][a-zA-Z()\.]*){1,4}
正则说明
\b:匹配单词边界[A-Z][a-zA-Z()\.]*:匹配首字母大写,后续可包含大小写字母、括号、点号的单词(?:\s[A-Z][a-zA-Z()\.]*){1,4}:匹配1-4个符合前面规则的单词(加上第一个单词,总共2-5个,符合原正则的数量要求)- 相比原正则,避免了末尾多余的空格匹配
修正后的代码
# 先处理空值,避免因NaN引发报错 combined_df['company'] = combined_df['subject_link_text'].fillna('').str.findall(r"\b(?:[A-Z][a-zA-Z()\.]*)(?:\s[A-Z][a-zA-Z()\.]*){1,4}") # 若需要将匹配到的列表转为字符串格式,可添加以下代码 combined_df['company'] = combined_df['company'].str.join(', ')
额外优化建议
如果需要更精准匹配带有常见后缀的公司名称,可使用以下正则:
\b(?:[A-Z][a-zA-Z]*\s)+(?:Ltd\.|Inc\.|Company|Corp\.|Co\.)(?:\s*\([a-z]+\))?
该正则会优先匹配包含Ltd./Inc.等常见公司后缀的名称,同时可兼容后缀后的括号内容(如示例中的(wholesale))
内容的提问来源于stack exchange,提问作者Smirithika Chandrasegar
相关产品推荐
相关产品推荐

