Python使用正则表达式删除DataFrame中符合特定模式的单词
问题原因
你当前的代码存在两个核心问题:
- 正则表达式仅覆盖了「连续重复单个字母」的场景,且规则书写错误,没有匹配另外两类需要排除的模式
- 筛选逻辑冗余,不需要通过
agg+any的方式跨行判断,直接对目标字符串列做正则匹配即可
正则规则修正
我们把三类需要排除的模式合并为一个正则表达式:
- 连续重复单个字母:
([a-z])\1+捕获单个字母后,匹配该字母连续重复1次及以上的场景 - 连续重复字母对:
([a-z]{2})\1+捕获两个字母的组合后,匹配该组合连续重复1次及以上的场景 - ABA结构:
([a-z])[a-z]\1匹配首尾相同、间隔1个任意字母的三元组结构
三类规则用|拼接,且不需要捕获分组的返回结果,所以统一改为非捕获组避免触发分组警告,最终正则为:r'(?:([a-z])\1+)|(?:([a-z]{2})\1+)|(?:([a-z])[a-z]\1)'
修正后完整代码
import pandas as pd data = {'Random' : ['helloooo', 'hahaha', 'kebab', 'shsh', 'title', 'miss', 'were', 'laptop', 'welcome', 'pencil']} df = pd.DataFrame(data) # 直接对目标列做匹配,取反得到符合要求的行 pattern = r'(?:([a-z])\1+)|(?:([a-z]{2})\1+)|(?:([a-z])[a-z]\1)' df = df[~df['Random'].str.contains(pattern, regex=True, na=False)].reset_index(drop=True) print(df)
输出结果
Random 0 laptop 1 welcome 2 pencil
完全符合预期,且不会再触发分组警告。
内容的提问来源于stack exchange,提问作者user01
相关产品推荐
相关产品推荐

