使用非捕获组的正则为何触发pandas str.contains警告?
问题解答
为什么用了非捕获组仍触发警告?
pandas的str.contains方法只要检测到正则表达式中存在任何括号定义的组结构(不管是捕获组()还是非捕获组(?:)),就会触发这个警告。它的逻辑是:既然你写了组,大概率是想提取分组内容,但contains只返回布尔值,无法返回分组结果,所以会提醒你改用str.extract。非捕获组只是不保存分组内容,但依然属于正则语法中的“组结构”,所以还是会被检测到。
解决方案(尽量少改动代码)
方案1:直接抑制该警告
如果不想修改正则代码,仅需在脚本开头添加过滤警告的代码,就能屏蔽这条特定的UserWarning:import warnings warnings.filterwarnings("ignore", message="This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.")方案2:用零宽断言替换非捕获组
将原正则中的非捕获组替换为零宽断言(不会创建任何组结构),既保留原匹配逻辑,又能避免警告。修改后的代码如下:word_in_data = self.data['text'].str.contains(r"(?<=^|[^a-zA-Z0-9])"+word+r"(?=$|[^a-zA-Z0-9])", na=False, regex=True).copy()这里的
(?<=...)是正向回顾断言,(?=...)是正向前瞻断言,它们只做位置匹配,不会生成分组,因此不会触发pandas的警告。方案3:改用符合原逻辑的单词边界写法
如果你原本倾向使用\b,但要注意原正则排除了下划线([^a-zA-Z0-9]不包含下划线,而\b的单词边界包含下划线),可以调整为匹配“非字母数字”的边界,写法如下:word_in_data = self.data['text'].str.contains(r"(?:^|(?<![a-zA-Z0-9]))"+word+r"(?:$|(?![a-zA-Z0-9]))", na=False, regex=True).copy()这个写法和原正则逻辑完全一致,且不会产生组结构,避免警告。
内容的提问来源于stack exchange,提问作者Daniele Rugginenti
相关产品推荐
相关产品推荐

