我们说我有以下字符串:'streets are shiny.'
我希望找到字符串'st'
的每一个匹配项,并将其替换为'ts'
。所以结果应该是'tseets are shiny'
。
我知道可以使用re.sub()
或str.replace()
完成此操作。但是,请说我有以下字符串:
'st'
'sts'
'stst'
我希望他们分别更改为'ts'
,'tss'
和'ttss'
,因为我希望所有出现的'st'
都更改为'ts'
。
用最佳运行时替换这些字符串的最佳方法是什么?我知道我可以继续执行检查以查看if "st" in string
,直到返回False
,但是有更好的方法吗?
答案 0 :(得分:2)
虽然循环解决方案可能是最简单的,但您实际上可以使用自定义函数编写re.sub
调用来立即执行所有转换。
这方面的主要见解是,您的规则(将st
更改为ts
)最终会将所有s
移动到混合s
和{t
的块中{1}}位于所有t
的右侧。我们可以简单地计算s
和t
并进行适当的替换:
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']