替换Python中的前导文本
我使用Python2.6,我想用另一个字符或字符串替换字符串中某些前导字符(替换Python中的前导文本,python,string,Python,String,我使用Python2.6,我想用另一个字符或字符串替换字符串中某些前导字符(、\ucode>和$)的每个实例。因为在我的例子中,替换字符串是相同的,所以我得出以下结论: def replaceLeadingCharacters(string, old, new = ''): t = string.lstrip(old) return new * (len(string) - len(t)) + t def replaceLeadingString(string, old, n
、\ucode>和$
)的每个实例。因为在我的例子中,替换字符串是相同的,所以我得出以下结论:
def replaceLeadingCharacters(string, old, new = ''):
t = string.lstrip(old)
return new * (len(string) - len(t)) + t
def replaceLeadingString(string, old, new = ''):
n = 0
o = 0
s = len(old)
while string.startswith(old, o):
n += 1
o += s
return new * n + string[o:]
这似乎很管用:
>>> replaceLeadingCharacters('._.!$XXX$._', '._$', 'Y')
'YYY!$XXX$._'
- 有没有更好(更简单或更有效)的方法在Python中实现相同的效果
- 有没有办法用字符串而不是字符来达到这种效果?类似str.replace()的东西,在输入字符串中出现与要替换的字符串不同的内容时停止?现在我想到了这个:
def replaceLeadingCharacters(string, old, new = ''):
t = string.lstrip(old)
return new * (len(string) - len(t)) + t
def replaceLeadingString(string, old, new = ''):
n = 0
o = 0
s = len(old)
while string.startswith(old, o):
n += 1
o += s
return new * n + string[o:]
我希望有一种不用显式循环就能做到这一点的方法
编辑:
使用re
模块有很多答案。我有几个问题:
- 当使用
str
方法替代它们时,它不是比它们慢很多吗
- 有没有一种简单的方法可以正确地引用/转义将在正则表达式中使用的字符串?例如,如果我想对
replaceLeadingCharacters
使用re
,我如何确保old
变量的内容不会把^[old]+
中的事情搞砸?我希望有一个“黑匣子”功能,它不需要用户注意他们提供的字符列表
但是我认为您的第一个解决方案足够好。您的replaceLeadingCharacters()
下面是使用模块的replaceLeadinString()
实现(没有while
循环):
当使用str方法替代它们时,它不是比str方法慢很多吗
别猜了。测量它的预期输入
有没有一种简单的方法可以正确地引用/转义将在正则表达式中使用的字符串
这是一个有趣的替代方案,尽管timeit
表示,对于短字符串,基于str
的版本要慢得多。但是,随着输入字符串的增长,它会变得更快,因此它可能会赶上更大的字符串。很好,很有用!我完全错过了re
文档中的re.escape()
+1嗯,在我的系统timeit
上说,对于任何大于50个字符的字符串,你的lreplace()
函数都比我的快得多。非常好@thkala:如果您粘贴代码(例如,粘贴在此处或作为答案),我可以在我的机器上进行测试。@J.F.塞巴斯蒂安:我将我的问题中的replaceLeadingString()
函数与之进行了比较-我还没有想出更好的方法。@thkala:我的意思是您期望的输入数据是什么:字符串长度分布,“输入字符串以旧值开始的次数”分布(或仅为平均值)。例如,对于短字符串replaceLeadingString()
比lreplace()快8倍