替换所有特定单词出现的地方

13 投票
4 回答
22763 浏览
提问于 2025-04-19 11:16

假设我有以下这句话:

bean likes to sell his beans

我想把特定的词替换成其他的词。比如,把 bean 替换成 robert,把 beans 替换成 cars

我不能直接用 str.replace,因为这样的话会把 beans 替换成 roberts

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

我需要只替换完整的单词,而不是在其他单词里的部分。我觉得我可以用正则表达式来实现这个,但我不知道怎么正确地做到这一点。

4 个回答

-1
"bean likes to sell his beans".replace("beans", "cars").replace("bean", "robert")

这个代码会把所有的“beans”替换成“cars”,把“bean”替换成“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')
0

这是一种不太干净的方法来实现这个功能,使用了折叠的方式。

reduce(lambda x,y : re.sub('\\b('+y[0]+')\\b',y[1],x) ,[("bean","robert"),("beans","cars")],"bean likes to sell his beans")
4

如果你一次只替换一个单词,可能会出现多次替换的情况,这样就可能得不到你想要的结果。为了避免这种情况,你可以使用一个函数或者一个简单的表达式(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)

这样一来,一旦把 bean 替换成 robert,它就不会再被修改了(即使 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)
22

如果你使用正则表达式,可以用 \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'

撰写回答