@leham1

Как в строке заменить нужные символы на другие (в определенных позициях)?

Мне необходимо чтобы re.sub заменял в строке не все найденные значения, а например только с 2-го по 4-е заменял. Как это сделать? Если это нельзя сделать через re.sub, тогда как?

Например : есть строка: 'AAAAdfkjvsAAAA dsjfrfls d AAAAskdnfijdnAAAA kdferjnks AAAAjdfnjAAAA'
Нужно чтобы заменилось только второе, третье и четвертое АААА на BB
Так должно получиться : 'AAAAdfkjvsBB dsjfrfls d BBskdnfijdnBB kdferjnks AAAAjdfnjAAAA'
  • Вопрос задан
  • 85 просмотров
Пригласить эксперта
Ответы на вопрос 2
@dmshar
Что-то ничего более красивого на ум не приходит. Попробуйте так:

import re
st = 'AAAAdfkjvsAAAA dsjfrfls d AAAAskdnfijdnAAAA kdferjnks AAAAjdfnjAAAA'
old='AAAA'
new='BB'
change_list=[1,2,3]
elt_list=[]
for i,a in enumerate(list(re.finditer(old, st))):
    elt_list.append([i,a.start()])
elt_list.reverse()
for elt in elt_list:
    if elt[0] in change_list:
        st=st[:elt[1]]+st[elt[1]:].replace(old, new,1)
print(st)


Результат:

AAAAdfkjvsBB dsjfrfls d BBskdnfijdnBB kdferjnks AAAAjdfnjAAAA


P.S. Отсчет удаляемых фрагментов, конечно, ведем с нуля.
Ответ написан
@Drill
from re import findall
from itertools import zip_longest

def change_subs(text, old_sub, new_sub, pos=[1]):
    subs = findall(old_sub, text)
    for i in pos: subs[i-1] = new_sub
    words = zip_longest(text.split(old_sub), subs, fillvalue='')
    return ''.join(''.join(elem) for elem in words)


Пример:
text = 'AAAAdfkjvsAAAA dsjfrfls d AAAAskdnfijdnAAAA kdferjnks AAAAjdfnjAAAA'
old = 'AAAA'
new = 'BB'
pos = [2,3,4]
a = change_subs(text, old, new, pos)
print(a)

In [28]:
AAAAdfkjvsBB dsjfrfls d BBskdnfijdnBB kdferjnks AAAAjdfnjAAAA
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы