Добавьте новую строку с определенным шаблоном перед совпадающим шаблоном в notepad ++

У меня есть файл csv, и я хотел бы его исправить. Мне нравится добавлять новую строку с «M19» перед каждой строкой с символами «M06».

До:

T40400010
M06
(T40400010, 5.0MM SOLID CARBIDE REAMER - 6FL)

После реформирования:

T40400010
M19
M06
(T40400010, 5.0MM SOLID CARBIDE REAMER - 6FL)

Я планирую решить эту проблему, используя регулярное выражение в Python, но я также открываю другие решения. Спасибо.

В вашем примере показано, что M19 вставил до в строку с M06. Что он? Вы отметили этот Python, но в заголовке есть Notepad ++. Опять же: что это?

dawg 13.09.2018 19:58

У меня есть файл в Notepad ++, и я хотел бы отредактировать его с помощью python, следуя шаблону, который добавляет новую строку с «M19» перед каждым «M06».

Chuck Zhu 13.09.2018 20:04
1
2
42
3

Ответы 3

Ты можешь сделать:

import re 

with open(fn) as f:
    for line in f:
        if re.search(r'^M06$', line):
            print('M19')
        print(line) 

Печать:

T40400010
M19
M06
(T40400010, 5.0MM SOLID CARBIDE REAMER - 6FL)

Если вы хотите, чтобы M19 был после M06, просто переместите print(line) выше if re.search(r'^M06$', line):, а не ниже.


Если вы хотите получить эффект «редактирования» файла, и файл имеет разумный размер (то есть легко помещается в памяти), вы можете сделать:

import re 

with open(fn) as f:
    data=re.sub(r'^(M06)$', r'M19\n\1', f.read(), flags=re.M)       

with open(fn, 'w') as f:
    f.write(data)   

Если у вас есть файл больше, чем вы хотите в памяти, вы можете сделать:

import re, tempfile, shutil

with open(fn, 'r') as f_in, tempfile.NamedTemporaryFile(mode='w', delete=False) as f_out:
    tmp_name=f_out.name
    for line in f_in:   
        if re.search(r'^M06$', line):
            print('M19\n',end='', file=f_out)   
        print(line,end='', file=f_out)  

shutil.move(tmp_name, fn)   

Спасибо. И вместо того, чтобы печатать файл, могу ли я напрямую отредактировать файл?

Chuck Zhu 13.09.2018 20:09

да. Вы бы открыли второй файл для записи. "печать" к этому. Затем переименуйте новый файл так же, как старый, чтобы перезаписать его. Это тот же эффект, что и при редактировании файла. В Python (или вообще в любой другой программе) нет редактирования на месте; все они делают это одинаково.

dawg 13.09.2018 20:13

Вы можете использовать Notepad ++ buildin search + диалог замены (Strg + H для меня).

Найдите регулярное выражение ^M06$ и замените его на M19\r\nM06 (используйте \n, если в unix, \r\n - это Windows).

Обязательно выберите опцию Regular expression.

Если вы действительно хотите, чтобы между этими двумя была новая строка, удвойте \r\n.

Search and replace dialog

Вы можете сделать это в Notepad ++, выполнив поиск с помощью этого выражения:

^(M06)$

И заменив его:

M19\n\1

Символ \n представляет новую строку, а \1 представляет собой ссылку на значение «M06» в скобках регулярного выражения. Все, что находится в скобках (в данном случае «M06»), будет захвачено и возвращено как \ 1.

Причина, по которой я использовал ссылку на группу захвата, вместо того, чтобы просто заменить ее на «M19 \ nM06», заключается в том, что вы можете изменить выражение, чтобы найти больше данных. Например, если в строке M06 есть другие данные, вы можете найти такое выражение:

^(.*M06.*)$

Редактировать: Патрик опередил меня до ответа. Я оставляю это только для добавления группы захвата.

Другие вопросы по теме