难道我们不能让双用string.replace
方法?
例如:
a = "foobarfoofoobarbar"
print(a)
>> foobarfoofoobarbar
n_instance_to_replace = 2
a = a.replace("foo", "FOO", n_instance_to_replace).replace("FOO","foo", n_instance_to_replace - 1)
print(a)
>> foobarFOOfoobarbar
基本上第一.replace("foo", "FOO", n_instance_to_replace)
匝"foo"
到第二次出现所有子串入"FOO"
,然后第二.replace("FOO", "foo", n_instance_to_replace)
把一切"FOO"
小号我们想改变一个在前回到"foo"
。
这可扩展改变每一个第n重复子像这样:
a = "foobarfoofoobarbar"*3 # create string with repeat "foo"s
n_instance = 2 # set nth substrings of "foo" to be replaced
# Replace nth subs in supstring
for n in range(n_instance, a.count("foo")+n_instance, n_instance)[::-1]:
a = a.replace("foo","FOO", n).replace("FOO","foo", n-1)
print(n, n-1, a)
>> 10 9 foobarfoofoobarbarfoobarfoofoobarbarfoobarfoofoobarbar
>> 8 7 foobarfoofoobarbarfoobarfoofoobarbarfoobarFOOfoobarbar
>> 6 5 foobarfoofoobarbarfoobarfooFOObarbarfoobarFOOfoobarbar
...
>> 2 1 foobarFOOfoobarbarFOObarfooFOObarbarfoobarFOOfoobarbar
的range()
基本上设置为找到每个"foo"
从a
字符串的结束开始指数。作为一个功能,这可能仅仅是:
def repl_subst(sup="foobarfoofoobarbar"*5, sub="foo", sub_repl="FOO", n_instance=2):
for n in range(n_instance, sup.count(sub)+n_instance, n_instance)[::-1]:
sup = sup.replace(sub, sub_repl, n).replace(sub_repl, sub, n-1)
return sup
a = repl_substr()
伟大的事情是,需要没有外部包。
编辑:我想我误解你的问题,现在看到,实际上要不断替换的
"foo"
每n个实例,而不是单个实例。我会仔细考虑是否仍然可以使用
.replace()
。但是,我不认为这是可能的。建议使用正则表达式的另一个答案始终是一个好的呼叫。
'every every nth'立刻让人想起模数运算符'%',在这里你有一个增量循环,每一遍都检查'incrementor%n',如果为零则让你改变 – Cwissy