我正在使用代码
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'
答案 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()))