在列表项上使用正则表达式替换整个单词

时间:2019-06-14 15:45:40

标签: python regex replace

我有一个包含对话的大型数据集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'选项。但是,我不知道如何在这里应用它。我可以为gemeentes中的每个单词运行一个for循环,并将其应用于整个数据集。但是考虑到它的大小(gemeentes具有300多个变量,而all_transcripts超过250万行),这在计算上将非常昂贵,因此,我希望使用与上述类似的方法,使用OR运算符替换字符串。

2 个答案:

答案 0 :(得分:2)

您似乎已经快到了,但是您需要稍微更改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万个条目并应用正则表达式。

答案 1 :(得分:0)

如果您使用的是熊猫数据框,则可以使用以下内容:

import pandas as pd

all_transcripts['filtered']= all_transcripts.replace([amsterdam', 'rotterdam', 'den haag', 'haarlem', 'groningen'], "woonplaats", regex=True)