如果字符仅在Python中使用re.sub出现在字符串的开头,则替换字符

时间:2013-11-20 21:20:30

标签: python regex

我希望只有第二个p替换为k

string="paper"
d=re.sub('[^p]p','k',string)
print d

这让我返回pker

我不知道为什么a也被替换了。

3 个答案:

答案 0 :(得分:2)

您可以使用负面外观并指定仅发生一次替换:

>>> import re
>>> s = 'paper'
>>> re.sub('(?<!^)p', 'k', s, 1)
'paker'

但是你可以在没有正则表达式的情况下做到这一点:

s[0] + s[1:].replace('p', 'k', 1)

答案 1 :(得分:1)

尝试使用捕获组和反向引用来捕获所有之前第二个p以及所有之后 第二个p

re.sub(r'(.+)p(.+)', r'\1k\2', string)
=> 'paker'

答案 2 :(得分:0)

我一直在努力让这个用于任何单词的第一个字母 - 没有指定它:

re.sub(r'(\w)(?=\w*\1\b)', 'k', s[::-1])[::-1]

它需要一个Python不支持的可变长度lookbehind,所以要通过它我反转字符串,使用可变长度前瞻然后反转结果:

>>> s = 'paper';
>>> re.sub(r'(\w)(?=\w*\1\b)', 'k', s[::-1])[::-1]
'paker'

对于一个句子,它使用每个单词的第一个字母:

>>> s = 'arabia bababooie paper';
>>> re.sub(r'(\w)(?=\w*\1\b)', 'k', s[::-1])[::-1]
'arkbik bakakooie paker'