替换所有出现的特定单词

2024-06-21 20:26:19 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一句话:

bean likes to sell his beans

我想用其他单词替换所有出现的特定单词。例如,beanrobertbeanscars

我不能只使用str.replace,因为在这种情况下,它会将beans更改为roberts

>>> "bean likes to sell his beans".replace("bean","robert")
'robert likes to sell his roberts'

我只需要改变整个单词,而不需要改变单词在另一个单词中的出现。我认为我可以通过使用正则表达式来实现这一点,但我不知道如何正确地实现它。


Tags: to情况单词carsrobertreplacelikesstr
3条回答

如果使用regex,可以使用\b指定单词边界:

import re

sentence = 'bean likes to sell his beans'

sentence = re.sub(r'\bbean\b', 'robert', sentence)
# 'robert likes to sell his beans'

这里的“beans”没有被更改(改为“roberts”),因为末尾的“s”不是单词之间的边界:\b匹配空字符串,但只在单词的开头或结尾

完整性的第二个替代:

sentence = re.sub(r'\bbeans\b', 'cars', sentence)
# 'robert likes to sell his cars'
"bean likes to sell his beans".replace("beans", "cars").replace("bean", "robert")

将“beans”的所有实例替换为“cars”,将“beans”替换为“robert”。这是因为.replace()返回原始字符串的修改实例。因此,你可以分阶段考虑。它基本上是这样工作的:

 >>> first_string = "bean likes to sell his beans"
 >>> second_string = first_string.replace("beans", "cars")
 >>> third_string = second_string.replace("bean", "robert")
 >>> print(first_string, second_string, third_string)

 ('bean likes to sell his beans', 'bean likes to sell his cars', 
  'robert likes to sell his cars')

如果你一次替换一个单词,你可能会替换好几次(而不是得到你想要的)。为了避免这种情况,可以使用函数或lambda:

d = {'bean':'robert', 'beans':'cars'}
str_in = 'bean likes to sell his beans'
str_out = re.sub(r'\b(\w+)\b', lambda m:d.get(m.group(1), m.group(1)), str_in)

这样,一旦beanrobert替换,它就不会被再次修改(即使robert也在您的单词输入列表中)。

正如georg所建议的,我用dict.get(key, default_value)编辑了这个答案。 替代解决方案(也由georg建议):

str_out = re.sub(r'\b(%s)\b' % '|'.join(d.keys()), lambda m:d.get(m.group(1), m.group(1)), str_in)

相关问题 更多 >