str.replace()或re.sub()一直持续到子串不再存在

时间:2015-05-04 21:38:00

标签: python regex string replace str-replace

我们说我有以下字符串:'streets are shiny.'我希望找到字符串'st'的每一个匹配项,并将其替换为'ts'。所以结果应该是'tseets are shiny'

我知道可以使用re.sub()str.replace()完成此操作。但是,请说我有以下字符串:

  1. 'st'
  2. 'sts'
  3. 'stst'
  4. 我希望他们分别更改为'ts''tss''ttss',因为我希望所有出现的'st'都更改为'ts'

    用最佳运行时替换这些字符串的最佳方法是什么?我知道我可以继续执行检查以查看if "st" in string,直到返回False,但是有更好的方法吗?

4 个答案:

答案 0 :(得分:2)

虽然循环解决方案可能是最简单的,但您实际上可以使用自定义函数编写re.sub调用来立即执行所有转换。

这方面的主要见解是,您的规则(将st更改为ts)最终会将所有s移动到混合s和{t的块中{1}}位于所有t的右侧。我们可以简单地计算st并进行适当的替换:

def sub_func(match):
    text = match.group(1)
    return "t"*text.count("t") + "s"*text.count("s")

re.sub(r'(s[st]*t)', sub_func, text)

答案 1 :(得分:0)

你可以用一个非常简单的while循环来做到这一点:

s="stst"
while('st' in s):
  s = s.replace("st", "ts")
print(s)
  

TTSS

答案 2 :(得分:0)

如果您想要不断检查,那么其他问题也能正常运行(问题是,如果您有类似stt的内容,则可以获得stt - > tst - > tts)。我不知道是不是想要那个。

但是,我认为您正在尝试用st替换ts的多个出现。如果是这种情况,您一定要使用string.replace。 .replace替换str的每次出现,直到你想要的程度。

根据this,这应该更快。

string.replace(s, old, new[, maxreplace])

示例:

>>>import string
>>>st='streets are shiny.streets are shiny.streets are shiny.'
>>>string.replace(st,'st','ts')
#out: 'tsreets are shiny.tsreets are shiny.tsreets are shiny.'

答案 3 :(得分:0)

天真地你可以这样做:

>>> ['t'*s.count('t')+'s'*s.count('s') for s in ['st', 'sts', 'stst']]
['ts', 'tss', 'ttss']
相关问题