在字符串中替换一个出现多次的模式一次

3 投票
4 回答
605 浏览
提问于 2025-04-18 05:31

我有一个字符串:

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?"

撰写回答