Вы можете использовать sub :
import re
text = ' '.join(
['k1', 'p1', 'k1', 'p1', 'k1', 'p2', 'k1', 'p2', 'k1', 'p3', 'k1', 'p3', 'k1', 'p1', 'k2', 'p1', 'k2', 'p3',
'k1', 'p2', 'k2', 'p1', 'k2', 'p1', 'k1', 'p1', 'k1', 'p1', 'k2', 'p2', 'k3', 'p1', 'k1', 'p2', 'k1', 'p2',
'k2', 'p1', 'k1', 'p1', 'k1', 'p2', 'k1', 'p2', 'k1', 'p2', 'k2', 'p2', 'k5', 'p2', 'k3', 'p1', 'k1', 'p1',
'k1', 'p2', 'k3', 'p1', 'k2', 'p3'])
def repl(match):
return int(match.group(2)) * match.group(1)
result = re.sub('([kp])([1-9])', repl, text)
print(result)
выход
k p k p k pp k pp k ppp k ppp k p kk p kk ppp k pp kk p kk p k p k p kk pp kkk p k pp k pp kk p k p k pp k pp k pp kk pp kkkkk pp kkk p k p k pp kkk p kk ppp
Объяснение
Шаблон ([kp])([1-9])
соответствует k
или p
, за которым следует любая цифра от 1
до 9
. Для части sub давайте посмотрим на документацию:
Возвращает строку, полученную путем замены крайнего левого непересекающегося
вхождения шаблона в строку заменой repl.
Оказывается, что repl
может быть функцией, которая получает объект сопоставления . В этом случае repl
берет вторую совпадающую группу (количество повторений), приведенную к int, умножается на первую совпадающую группу, букву k или p.
Обратите внимание, что в качестве входных данных я использовал пример вашего вопроса, объединенный пробелом.