如何在Python中将所有替换放在一个输出中?

时间:2017-03-10 21:09:32

标签: python replace

我正在使用代码

def callback():
  global text
  for k, v in mapping:
      print text.replace(k, v)

使用列表

mapping = [ ('and', 'for'), ('you', 'me'), ('more', 'less'), ('always', 'never') ]

输出结果

'for you more always'

'and me more always'

'and you less always'

'and you more never'

如何使输出变为

'for me less never'

3 个答案:

答案 0 :(得分:0)

def callback(text):
    for k, v in mapping:
        text = text.replace(k, v)
    return text

print callback(text)

您正在为循环的每次迭代打印。相反,你想先做所有的替换,然后打印。 text是一个字符串,因此是不可变的,这意味着text.replace不会改变text;它返回一个新字符串,它最容易分配回变量text

顺便说一句,你应该只在真正需要的时候使用全局变量,而且这里肯定没有必要,你可以将变量传递给函数。通过返回值而不是打印,通常更容易输出函数。通过这种方式,您可以对输出执行任何操作,包括打印输出,就像我在代码中所做的那样。

答案 1 :(得分:0)

我会使用带有单词边界的正则表达式(因此它对单词替换中的单词很有用)和一个替换函数来一次执行替换:

import re

mapping = [ ('and', 'for'), ('you', 'me'), ('more', 'less'), ('always', 'never') ]

mapping_dict = dict(mapping)

text = 'and you more always'
search_re = re.compile("("+"|".join([r"\b{}\b".format(s) for s,_ in mapping])+")")

print(search_re.sub(lambda g : mapping_dict[g.group(1)],text))

表达式由"键"组成。地图或“\b边界”一起使用,在这里:

(\band\b|\byou\b|\bmore\b|\balways\b)

当找到一个单词时发生正则表达式魔法:使用包含单词的组调用lambda函数,并且因为我已经用元组列表构建了一个字典(这是微不足道的),所以只返回与找到的单词相关联的值。

for me less never

答案 2 :(得分:0)

首先我们可以将元组列表转换为字典,这样就可以更快地搜索密钥。

然后,我们可以将句子拆分为单词并在字典上搜索键(使用get函数),如果不是默认返回相同的单词。

接下来我们可以使用生成器,然后使用 join 函数而不是替换(字符串是不可变的)。

mapping = [ ('and', 'for'), ('you', 'me'), ('more', 'less'), ('always', 'never') ]
mapping_dict = dict(mapping)
print (" ".join(mapping_dict.get(word, word) for word in text.split()))