Python Pandas数据集违禁词匹配问题:精准匹配独立违禁词
解决Pandas中筛选独立违禁词行的问题
这问题我太熟悉了!你当前的困境核心是没搞对正则匹配的边界规则——^和$是用来匹配整个字符串的首尾,而你需要的是匹配独立单词的边界,也就是确保违禁词是作为一个单独的单词出现,而不是长单词的一部分。
正确的解决方案:使用单词边界\b
正则里的\b表示单词边界,它会匹配一个单词的开始或结束位置(简单说就是单词前后不能是字母、数字或下划线)。把每个违禁词用\b包裹起来,就能精准匹配独立出现的违禁词了。
完整代码示例
import pandas as pd # 你的数据集示例 df = pd.DataFrame({ 'column': [ "This doctor is a psycho", "I had a psychotherapy that worked for me", "He called me a stupid idiot", "That's a stupidly bad idea" ] }) # 定义违禁词列表 forbidden_words = ["psycho", "fool", "stupid"] # 构建带单词边界的正则表达式 # 用|连接所有违禁词,每个词前后加\b pattern = r"\b(" + "|".join(forbidden_words) + r")\b" # 筛选匹配的行(case=False可选,用来忽略大小写匹配) df_match = df[df['column'].str.contains(pattern, case=False, regex=True)] print(df_match)
运行这个代码后,只会返回包含独立违禁词的行:
column 0 This doctor is a psycho 2 He called me a stupid idiot
为什么之前的方法不行?
- 第一种写法
df['column'].str.contains("fool|stupid|psycho"):没有任何边界限制,只要文本里包含这些字符串的子串就会匹配,所以"psychotherapy"里的"psycho"也会被命中。 - 第二种写法
df['column'].str.contains("fool|stupid|^psycho$"):^psycho$表示整个字符串必须完全等于"psycho"才会匹配,而你的文本是更长的句子,自然没有结果。
进阶:处理带特殊字符的违禁词
如果你的违禁词里包含正则特殊字符(比如.、*、(等),记得用re.escape()来转义,避免正则解析出错:
import re forbidden_words = ["psycho", "fool!", "stupid?"] pattern = r"\b(" + "|".join(re.escape(word) for word in forbidden_words) + r")\b"
内容的提问来源于stack exchange,提问作者marita
相关产品推荐
相关产品推荐

