Замена каждого n-го вхождения строки на n + строку в текстовом файле - PullRequest
0 голосов
/ 12 июня 2018

Текстовый файл содержит

This is line ABC XYZ. This is something. This is ABC XYZ. foo. This is ABC XYZ. foo

Требуемый вывод:

This is line 1 ABC XYZ. This is something. This is 2 ABC XYZ. foo. This is 3 ABC XYZ. foo 

Таким образом, проблема заключается в замене n-го вхождения ABC XYZ на n ABC XYZ .

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Метод re.sub может принимать функцию в качестве второго аргумента.Используйте функцию с состоянием с объектом itertools.count в качестве счетчика.

Код

import re, itertools

s = 'This is line ABC XYZ. This is something. This is ABC XYZ. foo. This is ABC XYZ. foo'

def enumerator():
    counter = itertools.count(1)

    return lambda m: '{} {}'.format(next(counter), m.group())

out = re.sub(r'ABC XYZ', enumerator(), s)

print(out)

Функция enumerator может быть повторно использована для любого шаблона.

Выход

This is line 1 ABC XYZ. This is something. This is 2 ABC XYZ. foo. This is 3 ABC XYZ. foo
0 голосов
/ 12 июня 2018

Код :

import re

text = "This is line ABC XYZ. This is something. This is ABC XYZ. foo. This is ABC XYZ. foo"
x = re.split("(ABC XYZ)",text)
c=0
for i,s in enumerate(x):
    if re.match('(ABC XYZ)',x[i]):
        c+=1
        x[i] = str(c)+' '+x[i]
x = ''.join(x)   # This is line 1 ABC XYZ. This is something. This is 2 ABC XYZ. foo. This is 3 ABC XYZ. foo

Вы можете использовать более оптимизированные способы сделать это, однако это поможет вам лучше понять это.

0 голосов
/ 12 июня 2018

Вы можете использовать понимание списка

a="This is line ABC XYZ. This is something. This is ABC XYZ. foo. This is ABC XYZ. foo"
''.join([e+str(c+1)+" ABC XYZ" for c,e in enumerate(a.split("ABC XYZ"))][0:-1])+a.split("ABC XYZ.")[-1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...