在记事本++中的匹配模式之前添加具有特定模式的新行

时间:2018-09-13 17:55:58

标签: python regex

我有一个csv文件,我想对其进行修改。我想在每行包含字符“ M06”的行之前添加“ M19”的新行。

之前:

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

重整后:

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

我正计划在python中使用正则表达式解决此问题,但我也愿意接受其他解决方案。谢谢。

3 个答案:

答案 0 :(得分: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)   

答案 1 :(得分:1)

您可以使用Notepad ++内置搜索+替换对话框(对我来说是Strg + H)。

搜索正则表达式^M06$并将其替换为M19\r\nM06(如果在unix上,\n是Windows,则使用\r\n)。

确保选择Regular expression选项。

如果您真的想在两者之间使用换行符,请在\r\n上加倍

Search and replace dialog

答案 2 :(得分:0)

您可以在Notepad ++中通过搜索以下表达式来做到这一点:

^(M06)$

并替换为:

M19\n\1

\n字符代表换行,\1代表对正则表达式括号中“ M06”值的引用。括号中的所有内容(在本例中为“ M06”)都将被捕获,并以\ 1返回。

之所以使用对捕获组的引用而不是仅将其替换为“ M19 \ nM06”的原因是,因为您可能希望更改表达式以查找更多数据。例如,如果M06行上还有其他数据,则您可能希望查找如下表达式:

^(.*M06.*)$

编辑:帕特里克击败了我。我只剩下添加捕获组了。