替换Python中的前导文本

时间:2011-01-10 18:15:50

标签: python string

我使用的是Python 2.6,我想在一个字符串中用另一个字符或字符串替换某些前导字符(._$)的每个实例。因为在我的情况下替换字符串是相同的,我想出了这个:

def replaceLeadingCharacters(string, old, new = ''):
    t = string.lstrip(old)

    return new * (len(string) - len(t)) + t

似乎工作正常:

>>> replaceLeadingCharacters('._.!$XXX$._', '._$', 'Y')
'YYY!$XXX$._'
  • 是否有更好(更简单或更有效)的方式在Python中实现相同的效果?

  • 有没有办法用字符串而不是字符来实现这种效果?像str.replace()这样的东西会在输入字符串中出现一个与要替换的字符串不同的东西时停止吗?现在我想出了这个:

    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方法?

  • 是否有一种简单的方法来正确引用/转义将在正则表达式中使用的字符串?例如,如果我想对re使用replaceLeadingCharacters,我如何确保old变量的内容不会在^[old]+中搞乱?我宁愿使用“黑盒子”功能,不要求用户注意他们提供的字符列表。

2 个答案:

答案 0 :(得分:1)

re.sub(r'^[._$]+', lambda m: 'Y' * m.end(0), '._.!$XXX$._')

但恕我直言,你的第一个解决方案就足够了。

答案 1 :(得分:1)

您的replaceLeadingCharacters()似乎很好。

这是使用re模块的replaceLeadingString()实现(没有while循环):

#!/usr/bin/env python
import re

def lreplace(s, old, new):
    """Return a copy of string `s` with leading occurrences of
    substring `old` replaced by `new`.

    >>> lreplace('abcabcdefabc', 'abc', 'X')
    'XXdefabc'
    >>> lreplace('_abc', 'abc', 'X')
    '_abc'
    """
    return re.sub(r'^(?:%s)+' % re.escape(old),
                  lambda m: new * (m.end() / len(old)),
                  s)
  

当用作替代它们时,它是否明显慢于str方法?

不要猜。测量它以获得预期的输入。

  

是否有一种简单的方法来正确引用/转义将在正则表达式中使用的字符串?

re.escape()