Python - 尝试替换字符串列表中的单词但遇到单字母单词问题

Python - Trying to replace words in a list of strings but having problems with single letter words

我有一个字符串列表,例如 words = ['Twinkle Twinkle', 'How I wonder'] 我正在尝试创建一个函数来查找和替换原始列表中的单词,我能够做到这一点,除非用户输入单个字母单词,例如 'I' 或 'a' 等

当前函数

def sub(old: string, new: string, words: list):
    words[:] = [w.replace(old, new) for w in words]

如果输入旧 = 'I' 和新的 = 'ASD'

当前输出 = ['TwASDnkle TwASDnkle', 'How ASD wonder']

预期产出 = ['Twinkle Twinkle', 'How ASD wonder']

这是我第一次 post 来这里,我才学习 python 几个月,所以我很感激任何帮助,谢谢

您似乎是在替换字母而不是单词。我建议通过 ' ' (space 字符)拆分字符串来将句子(字符串)拆分成单词。

output = []

我首先会像这样从列表中获取每个字符串:

for string in words:

然后我会将字符串拆分成这样的单词列表:

    temp_string = '' # a temp string we will use later to reconstruct the words
    for word in string.split(' '):

然后我会通过将它与 old 进行比较并用 new:

替换(如果匹配)来检查这个词是否是我们正在寻找的那个
        if word == old: 
            temp_string += new + ' '
        else:
            temp_string += word + ' '

现在我们已经将每个单词重构或替换(如果需要)回到 temp_string 中,我们可以像这样将所有 temp_string 放回数组中:

    output.append(temp_string[:-1]) # [:-1] means we omit the space at the end

最终应该是这样的:

def sub(old: string, new: string, words: list):
    output = []
    for string in words:
        temp_string = '' # a temp string we will use later to reconstruct the words
        for word in string.split(' '):
            if word == old: 
                temp_string += new + ' '
            else:
                temp_string += word + ' '
        output.append(temp_string[:-1]) # [:-1] means we omit the space at the end
    return output

不要在循环中使用 str.replace。这通常不会达到预期的效果,因为它不适用于单词但适用于所有匹配项。

相反,split 匹配时替换单词 join:

l = ['Twinkle Twinkle', 'How I wonder']

def sub(old: str, new: str, words: list):
    words[:] = [' '.join(new if w==old else w for w in x.split()) for x in words]
    
sub('I', 'ASD', l)

输出:['Twinkle Twinkle', 'How ASD wonder']

或者使用带有单词边界的正则表达式:

import re

def sub(old, new, words):
    words[:] = [re.sub(fr'\b{re.escape(old)}\b', new, w) for w in words]
    
l = ['Twinkle Twinkle', 'How I wonder']
sub('I', 'ASD', l)
# ['Twinkle Twinkle', 'How ASD wonder']

注意。正如@re-za 指出的那样,return 一个新列表而不是改变输入可能是更好的做法,请注意它