首页 > 解决方案 > 在列表项上使用正则表达式来替换整个单词

问题描述

all_transcripts我有一个包含对话 的大型数据集,我有一个gemeentes包含不同城市名称的小列表。在all_transcripts中,我想用“woonplaats”(城市的荷兰语)替换每个给出城市名称的实例。

为此,我有以下代码:

all_transcripts['filtered'] = all_transcripts['no_punc'].str.replace('|'.join(gemeentes),' woonplaats ')

但是,这会替换出现单词组合的每个实例,而不仅仅是整个单词。

我正在寻找的是这样的:

all_transcripts['filtered'] = all_transcripts['no_punc'].re.sub('|'r"\b{}\b".format(join(gemeentes)),' woonplaats ')

但这不起作用。

例如,我有:

all_transcripts['no_punc'] = ['i live in amsterdam', 'i come from haarlem', 'groningen is her favourite city']

gemeentes = ['amsterdam', 'rotterdam', 'den haag', 'haarlem', 'groningen']

运行代码后,我想要的输出如下:

>>> ['i live in woonplaats', 'i come from woonplaats', 'woonplaats is her favourite city']

之前,我使用过正则表达式的 '\b' 选项。但是,我不知道如何在这里应用它。我可以为每个单词运行一个 for 循环gemeentes并将其应用于整个数据集。但是考虑到它的大小(gemeentes 有超过 300 个变量和超过 250 万行的 all_transcripts),这在计算上会非常昂贵,因此,我想要一种与上面类似的方法,即使用 OR 运算符替换字符串。

标签: pythonregexreplace

解决方案


看起来你很接近,但你会想re.sub稍微改变你的通话。像这样的东西应该工作:

gemeentes = ['amsterdam', 'rotterdam', 'den haag', 'haarlem', 'groningen']
all_transcripts['filtered'] = [re.sub(r"\b({})\b".format("|".join(gemeentes)), "woonplaats", s) for s in all_transcripts['no_punc']]

输出

all_transcripts['filtered'] = ['我住在 woonplaats', '我来自 woonplaats', 'woonplaats 是她最喜欢的城市']

至于性能,我不确定您是否会比传统的 for 循环获得更好的速度,因为您仍然需要遍历 2500 万个条目并应用正则表达式。


推荐阅读