2013-06-02 4 views
0

Как я могу выполнить поиск и ЗАМЕНИТЬ строку. Чтобы быть более конкретным.Поиск и замена строки под определенной строкой

У меня есть текстовый файл с

SAMPLE 
AB 
CD 
.. 
TYPES 
AB 
QP 
PO 
.. 
RUNS 
AB 
DE 
ZY 

Я хочу заменить AB с XX, только под линиями SAMPLE и RUNS. Я уже пробовал несколько способов использования replace(). Я попробовал что-то вроде

if 'SAMPLE' in line: 
    f1.write(line.replace('testsample', 'XX')) 
if 'RUNS' in line: 
    f1.write(line.replace('testsample', 'XX')) 

и что не работал.

ответ

3

Файл итератор над линиями в Python:

for line in file: 
    output.write(line) # save as is 
    if 'SAMPLE' in line or 'RUNS' in line: 
     line = next(file, "") # move to the next line 
     output.write(line.replace('AB', 'XX')) # save replacing AB with XX 

Для поддержки SAMPLE/БЕГА линии, которые следуют друг за другом SAMPLE/БЕГА линии, например:

SAMPLE 
SAMPLE 
AB 

вы можете:

for line in file: 
    output.write(line) # save as is 
    while 'SAMPLE' in line or 'RUNS' in line: 
     line = next(file, "") # move to the next line 
     output.write(line.replace('AB', 'XX')) # save replacing AB with XX 
+2

Вы должны понимать, что это заменит «AB» на «XX», даже если AB является частью линии (CRAB -> CRXX). – oleg

+0

@oleg: да. Вы видите какие-либо признаки в вопросе, что это должно быть иначе? – jfs

+1

Нет, но формулировка задачи кажется мне неоднозначной. и я решаю обратить внимание на этот аспект. – oleg

2

Самый простой способ - перебрать файл по строкам, и каждый раз, когда вы видите строку SAMPLE или RUNS, чтобы сохранить флаг, означающий «предыдущая строка была той, которую я искал». Любая другая строка сбросит этот флаг. Теперь на каждой итерации вы проверяете, был ли флаг установлен во время предыдущей итерации, и если это вы делаете свой .replace.

1

Предполагая, что вы не хотите, чтобы линии ниже SAMPLES заменены, и вы не хотите заменять строка, которая содержит ABC, это будет немного более надежным, если ваш файл содержит больше текста на строку, чем строки, которые вы ищете.

valid_sections = set(('RUNS', 'SAMPLE')) 
for raw_line in fobj_in: 
    clean_line = raw_line.strip() 
    if clean_line in valid_sections: 
     fobj_out.write(raw_line) 
     raw_line = next(fobj_in) 
     clean_line = raw_line.strip() 
     if clean_line == 'AB': 
      fobj_out.write(raw_line.replace('AB', 'XX')) 
     else: 
      fobj_out.write(raw_line) 
    else: 
     fobj_out.write(raw_line) 
+0

'clean_line в valid_sections и clean_line == 'AB'' всегда' False' в вашем коде для любого ввода. – jfs

+0

Спасибо за указатель. Исправлено. Вам нужно перейти на следующую строку для поиска 'AB'. –

+0

вам нужно добавить литые строки. – jfs

Смежные вопросы