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
一个新列表而不是改变输入可能是更好的做法,请注意它
我有一个字符串列表,例如
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
一个新列表而不是改变输入可能是更好的做法,请注意它