難道我們不能讓雙用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