Вы можете использовать цикл while с str.find
, чтобы найти n-е вхождение, если оно существует, и использовать эту позицию для создания новой строки:
def nth_repl(s, sub, repl, nth):
find = s.find(sub)
# if find is not p1 we have found at least one match for the substring
i = find != -1
# loop util we find the nth or we find no match
while find != -1 and i != nth:
# find + 1 means we start at the last match start index + 1
find = s.find(sub, find + 1)
i += 1
# if i is equal to nth we found nth matches so replace
if i == nth:
return s[:find]+repl+s[find + len(sub):]
return s
Пример:
In [14]: s = "foobarfoofoobarbar"
In [15]: nth_repl(s, "bar","replaced",3)
Out[15]: 'foobarfoofoobarreplaced'
In [16]: nth_repl(s, "foo","replaced",3)
Out[16]: 'foobarfooreplacedbarbar'
In [17]: nth_repl(s, "foo","replaced",5)
Out[17]: 'foobarfoofoobarbar'
(Устаревший ответ - похоже, бэкпорт для 3.5 больше не доступен)
Вы не можете использовать полные параллельные расширения, нет...
... но если вы установите Reactive Extensions для .NET 3.5, то в комплекте с ним идет версия Parallel Extensions, так что вы можете ее использовать. Я не знаю, насколько поддерживается PFX, но подозреваю, что для большинства людей этого достаточно. (Есть некоторые подробности в сообщении в блоге, но это было в 2009 году... Я не знаю о каких-либо изменениях в 2010 году, которые могли быть или не быть перенесены.)
Обратите внимание, что это тоже не поддерживается - возможно, это подходит для хобби-проектов, но если бы я хотел использовать PFX коммерчески, я бы перешел на .NET 4.
. Как отметил Джон Скит, Rx
перенес TPL
в .NET 3.5
.
Я сделал Nuget (называемый TaskParallelLibrary ) из их System.Threading.dll
, для более легкой интеграции.
Вы можете получить его из http://nuget.org/packages/TaskParallelLibrary .