不需要的部分匹配与Python替换

时间:2014-07-07 04:34:22

标签: python

有一个非常简单的函数来替换dict:

def replace_all(text, dic):
    for i, j in dic.iteritems():
        text = text.replace(i, j)
    return text

我在pandas dataframe列中调用此函数。可以是一个列表或其他任何东西,它只是我现在的例子) 以下是dataframe的示例:

**root**
P1 
P2
P10

我想最终得到类似的东西:

**root**   **gen**
P1         bob
P2         jack
P10        mike

因此我使用这个小函数和一个字典

gen={"P1":"bob", "P2":"jack", "P10":"mike"}
df['gen']=df['root'].apply(lambda x : replace_all(x,gen))

没有错误信息,但我得到部分匹配。

**root**   **gen**
P1         bob
P2         jack
P10        bob0

花了P10并替换为P1,这有点意义,但如何防止这种情况?

由于

4 个答案:

答案 0 :(得分:1)

str.replace方法完全按照文档说的那样做...: - p

尝试将replace_all功能更改为:

def replace_all(text, dic):
    return dic.get(text, text)

dict.get(key, default)方法在dict[key]时返回key in dict,否则返回default

答案 1 :(得分:0)

这是因为str.replace()将替换字符串中任何位置找到的“子字符串”。

请参阅:str.replace

选项:

  1. 使用正则表达式进行匹配和替换。
  2. 匹配整个字符串并替换。

答案 2 :(得分:0)

text = text.replace(i, j)替换为text = dic[text]

答案 3 :(得分:0)

由于replace会找到字符串的任何部分,因此请将此视为替代:

>>> text = 'Hello P1 this is P2 with P10'
>>> d = {'P1': 'world', 'P2': 'peanut', 'P10': 'butter'}
>>> ' '.join(d.get(i, i) for i in text.split())
'Hello world this is peanut with butter'