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

时间:2014-05-06 07:53:10

标签: python regex substitution

我有一个字符串:

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

但它取代了我想要的东西。

我怎样才能让它只取代第二个"查理"没有别的吗?

4 个答案:

答案 0 :(得分:3)

将第一个子字符串(及其后面的所有子字符串)替换为自身,并添加limit = 1以防止替换第4次,第6次等事件。

s = "I am Tony not charlie, Hey charlie how's you?"
print re.sub('(charlie.*?)charlie', r'\1Tony', s, 1)

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

答案 2 :(得分:1)

对于固定模式(不是你的情况),后视/前方断言可能很方便:

re.sub(r'(?<=Hey )charlie','Tony',string

答案 3 :(得分: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)

此功能允许您选择要替换的事件。要替换的默认索引是&#34; 1&#34;,即第二次出现:

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