在字符串中替换一个出现多次的模式一次
我有一个字符串:
I am Tony not charlie, Hey charlie how's you?
我想替换第二个“Charlie”,但不想替换第一个。
期望的字符串是:
I am Tony not charlie, Hey Tony how's you?
我正在使用以下语句来实现这个替换:
>>> re.sub(r',\s\w{3}\scharlie\s', ' Tony ', 'I am Tony not charlie, Hey charlie how\'s you\?')
"I am Tony not charlie Tony how's you?"
但是它替换的内容比我想要的多。
我该怎么做才能只替换第二个“Charlie”,而不影响其他的呢?
4 个回答
0
你可以自己创建一个替换函数。你可以把输入的句子根据你想替换的词拆分开,然后检查你想替换的那个词的位置:
def rreplace(s, delimiter, replacement, positions=[1]):
result = []
sentences = s.split(delimiter)
for i, sentence in enumerate(sentences):
result.append(sentence)
if not i == len(sentences)-1:
if i in positions:
result.append(replacement)
else:
result.append(delimiter)
return "".join(result)
这个函数让你可以选择替换哪些出现的词。默认情况下,它会替换第一个出现的词,也就是第二次出现的那个:
s = "I am Tony not charlie, Hey charlie how's you?"
delimiter = "charlie"
replacement = "Tony"
print rreplace(s, delimiter, replacement)
# I am Tony not charlie, Hey Tony how's you?
你还可以通过覆盖位置参数来选择多个替换项:
s = "charlie charlie charlie"
delimiter = "charlie"
replacement = "Tony"
print rreplace(s, delimiter, replacement, [0, 2])
# Tony charlie Tony
1
对于一些固定的模式(虽然这不是你的情况),使用“向后看”或“向前看”的断言可能会很有用:
re.sub(r'(?<=Hey )charlie','Tony',string
)
3
把第一个出现的子字符串(以及它后面的所有内容)替换成它自己,并加上一个限制条件 =1,这样就不会替换第4个、第6个等其他出现的地方。
s = "I am Tony not charlie, Hey charlie how's you?"
print re.sub('(charlie.*?)charlie', r'\1Tony', s, 1)
1
在你的表达式中,你需要使用分组。
看看这是不是你想要的:
>>> re.sub(r'(,\s\w*\s)charlie', r'\1Tony', r"I am Tony not charlie, Hey charlie
how's you?")
"I am Tony not charlie, Hey Tony how's you?"