繁体   English   中英

如何在文本行之间搜索单词并用 Python 在文本文件中替换它?

[英]How to search word in between text lines and replace it in Text file with Python?

我有一个来自数控机床的文件。 我需要在文本文件中更改两个参数N1530 M136 --> N1530 M128N1710 M137 --> N1710 M129 ,对于特定的数控机床名称,在这种情况下,它是 N1240 行中的“803”(所有这些行号都在其他文件)。 我正在尝试使用正则表达式,找到要查看的文本块,并仅替换此文本块中的特定M136 --> M128 但是正则表达式只给了我找到机器名称“803”的结果。

我在 regex101 网站中使用了(?:\\G(?!\\A)|\\"603\\")(?:(?!\\:ENDFOR).)*?\\KM136 ,它起作用了。 但是当我选择 Python 时,它根本不起作用。 我知道语法上存在差异,或者只是 Python 无法以这种方式处理它。

对于这类问题,也许 Python 中有更好的解决方案。

全文文件

[COMMENTO]
VER 3.2.0 - Build 449
%

[PARAMETRI01]
N10 G71 LX=1270.83375 LY=575.39375 LZ=106.00000 P103=1122
%

[SEIFERT01]
;SETPEN
"ALL" ZP 1,2,3;
"STOPS + SUCTION CUPS" ZP 1,2;
"STOPS" ZP 1;
"SUCTION CUPS" ZP 2;
"PROFILE" ZP 3;
;ENDSEC
;BATTUTE
SP1;
PU;
PA -15.00000,203.70029;
PD;
CI 13.00000;
PU;
PA 225.90810,-15.00000;
PD;
CI 13.00000;
PU;
PA 665.50118,-15.00000;
PD;
CI 13.00000;
PU;
;ENDSEC
;VENTOSE
SP2;
PU;
PA 806.67132,89.33461;
PD;
CI 60.00000;
PU;
PA 806.67132,276.96581;
PD;
CI 60.00000;
PU;
PA 449.27857,171.53494;
PD;
CI 60.00000;
PU;
PA 111.54242,264.45706;
PD;
CI 60.00000;
PU;
PA 99.03368,91.12157;
PD;
CI 60.00000;
PU;
;ENDSEC
;PROFILI
SP3;
PU;
PA 2.00000,0.00000;
PD;
AA 2.00000,2.00000,-90.00;
PA 0.00000,363.00000;
AA 2.00000,363.00000,-90.00;
PA 900.00000,365.00000;
AA 900.00000,363.00000,-90.00;
PA 902.00000,2.00000;
AA 900.00000,2.00000,-90.00;
PA 2.00000,0.00000;
PU;
;ENDSEC
%

[UTENSILI01]
801
802
803
%

[LAVORAZIONI01]
 1 - 0 - Contouring - 801 - EDGE MILL H8
 1 - 1 - Contouring - 802 - EDGE GRINDER H8
 2 - Contouring - 803 - POLISH H8 TEST
%

[CONTORNATURA01]

N20 R1=-221.11250
N30 R2=1049.72125
N40 R4=-142.86250
N50 R3=432.53125
N60 R6=-13.00000
N70 R5=93.00000
N80 R7=P007
N90 P619=0.00000
N100 P620=0.00000
N110 P621=902.00000
N120 P622=365.00000
N130 P623=-1.00000
N140 P624=-1.00000
N150 P625=-1.00000
N160 P626=-1.00000
N170 P826=180
N180 P827=10
N190 ST1="801"
N200 L=PINIZIO
N210 L=PZHIGH

N220 JM(P010=4):1000

N230 JM(((P010=2)#(P010=3))~(R7=1)):1
N240 JM(((P010=2)#(P010=3))~(R7=2)):2
N250 JM(((P010=2)#(P010=3))~(R7=3)):3
N260 JM(P010<>1):99999

:1
N270 R7=1
N280 ST1="801"
N290 L=PCAMBIOUT
:FOR P500=P008 TO (P001-1)
N300 L=PZTRASLA
N310 P011=2.00000
N320 P012=-75.47500
N330 P013=80.00000
N340 P252=0.00000
N350 P514=0.000
N360 P501=0
N370 P607=0
N380 P046=0
N390 P077=2500
N400 P608=1
N410 L=PRELAV2
N420 L=PREFRINT01ON
N430 L=PREFREXT01ON
N440 PS01=-6000
N450 L=PSTARTROT01
N460 L=PTCPYES
N470 G01 G300 X=2.00000 Y=-75.47500
N480 P014=P069
N490 L=PONINT2
N500 G01 G300 Z=P014
N510 G68
N520 L=PBLOCCAC
N530 L=PRPMOK01
N540 M33200
N550 G01 G42 X=-73.07500 Y=-75.47500  F=1750 
N560 G02 X=2.00000 Y=-0.40000  I=2.00000 J=-75.47500 
N570 M136
N580 G01 X=900.00000 Y=-0.40000  F=2500 
N590 G03 X=902.40000 Y=2.00000  I=900.00000 J=2.00000 
N600 G01 X=902.40000 Y=363.00000  
N610 G03 X=900.00000 Y=365.40000  I=900.00000 J=363.00000 
N620 G01 X=2.00000 Y=365.40000  
N630 G03 X=-0.40000 Y=363.00000  I=2.00000 J=363.00000 
N640 G01 X=-0.40000 Y=2.00000  
N650 G03 X=2.00000 Y=-0.40000  I=2.00000 J=2.00000 
N660 M137
N670 G02 X=77.07500 Y=-75.47500  I=2.00000 J=-75.47500 
N680 M021
N690 G01 G40 X=2.00000 Y=-75.47500  
N700 G01 G300 X=2.00000 Y=-75.47500 Z=80.00000+P102 
N710 L=PTCPNO
N720 L=PSBLOCCAC
N730 L=POFFINT2

:ENDFOR
N740 JM(P010=2):99999

:2
N750 R7=2
N760 ST1="802"
N770 L=PCAMBIOUT
:FOR P500=P008 TO (P001-1)
N780 L=PZTRASLA
N790 P011=2.00000
N800 P012=-71.40000
N810 P013=80.00000
N820 P252=0.00000
N830 P514=0.000
N840 P501=0
N850 P607=0
N860 P046=0
N870 P077=2500
N880 P608=1
N890 L=PRELAV2
N900 L=PREFRINT01ON
N910 L=PREFREXT01ON
N920 PS01=-5500
N930 L=PSTARTROT01
N940 L=PTCPYES
N950 G01 G300 X=2.00000 Y=-71.40000
N960 P014=P069
N970 L=PONINT2
N980 G01 G300 Z=P014
N990 G68
N1000 L=PBLOCCAC
N1010 L=PRPMOK01
N1020 M33200
N1030 G01 G42 X=-69.40000 Y=-71.40000  F=1750 
N1040 G02 X=2.00000 Y=0.00000  I=2.00000 J=-71.40000 
N1050 M136
N1060 G01 X=900.00000 Y=0.00000  F=2500 
N1070 G03 X=902.00000 Y=2.00000  I=900.00000 J=2.00000 
N1080 G01 X=902.00000 Y=363.00000  
N1090 G03 X=900.00000 Y=365.00000  I=900.00000 J=363.00000 
N1100 G01 X=2.00000 Y=365.00000  
N1110 G03 X=0.00000 Y=363.00000  I=2.00000 J=363.00000 
N1120 G01 X=0.00000 Y=2.00000  
N1130 G03 X=2.00000 Y=0.00000  I=2.00000 J=2.00000 
N1140 M137
N1150 G02 X=73.40000 Y=-71.40000  I=2.00000 J=-71.40000 
N1160 M021
N1170 G01 G40 X=2.00000 Y=-71.40000  
N1180 G01 G300 X=2.00000 Y=-71.40000 Z=80.00000+P102 
N1190 L=PTCPNO
N1200 L=PSBLOCCAC
N1210 L=POFFINT2

:ENDFOR
N1220 JM(P010=2):99999

:3
N1230 R7=3
N1240 ST1="803"
N1250 L=PCAMBIOUT
:FOR P500=P008 TO (P001-1)
N1260 L=PZTRASLA
N1270 P011=2.00000
N1280 P012=-75.75000
N1290 P013=80.00000
N1300 P252=0.00000
N1310 P514=0.000
N1320 P501=0
N1330 P607=0
N1340 P046=0
N1350 P077=2200
N1360 P608=1
N1370 L=PRELAV2
N1380 L=PREFRINT01ON
N1390 L=PREFREXT01ON
N1400 PS01=-3600
N1410 L=PSTARTROT01
N1420 L=PTCPYES
N1430 G01 G300 X=2.00000 Y=-75.75000
N1440 P014=P069
N1450 L=PONINT2
N1460 G01 G300 Z=P014
N1470 G68
N1480 L=PBLOCCAC
N1490 L=PRPMOK01
N1500 M33200
N1510 G01 G42 X=-73.75000 Y=-75.75000  F=350 
N1520 G02 X=2.00000 Y=0.00000  I=2.00000 J=-75.75000 
N1530 M136
N1540 G01 X=880.00000 Y=0.00000  F=2200
N1550 G01 X=900.00000 Y=0.00000  F=420 
N1560 G03 X=902.00000 Y=2.00000  I=900.00000 J=2.00000 F=1500
N1570 G01 X=902.00000 Y=22.00000  F=1500
N1580 G01 X=902.00000 Y=343.00000  F=2200 
N1590 G01 X=902.00000 Y=363.00000  F=420 
N1600 G03 X=900.00000 Y=365.00000  I=900.00000 J=363.00000 F=1500
N1610 G01 X=880.00000 Y=365.00000  F=1500
N1620 G01 X=22.00000 Y=365.00000  F=2200 
N1630 G01 X=2.00000 Y=365.00000  F=420 
N1640 G03 X=0.00000 Y=363.00000  I=2.00000 J=363.00000 F=1500
N1650 G01 X=0.00000 Y=343.00000  F=1500
N1660 G01 X=0.00000 Y=22.00000  F=2200 
N1670 G01 X=0.00000 Y=2.00000  F=420 
N1680 G03 X=2.00000 Y=0.00000  I=2.00000 J=2.00000 F=1500
N1690 G01 X=22.00000 Y=0.00000  F=1500
N1700 G01 X=32.00000 Y=0.00000  F=2200 
N1710 M137
N1720 G02 X=107.75000 Y=-75.75000  I=32.00000 J=-75.75000 
N1730 M021
N1740 G01 G40 X=32.00000 Y=-75.75000  
N1750 G01 G300 X=32.00000 Y=-75.75000 Z=80.00000+P102 
N1760 L=PTCPNO
N1770 L=PSBLOCCAC
N1780 L=POFFINT2

:ENDFOR
N1790 JM(P010=2):99999

N1800 JM:99999
:1000
N1810 L=PINITBATVENT
:FOR P500=P008 TO (P001-1)
N1820 L=PLETORIG
N1830 P502=0
N1840 P466=-15.00000
N1850 P467=203.70029
N1860 P460=26.00000
N1870 L=POSBV
N1880 P502=0
N1890 P466=225.90810
N1900 P467=-15.00000
N1910 P460=26.00000
N1920 L=POSBV
N1930 P502=0
N1940 P466=665.50118
N1950 P467=-15.00000
N1960 P460=26.00000
N1970 L=POSBV
N1980 P502=1
N1990 P466=806.67132
N2000 P467=89.33461
N2010 P460=120.00000
N2020 P461=0.00000
N2030 P462=0.00000
N2040 L=POSBV
N2050 P502=1
N2060 P466=806.67132
N2070 P467=276.96581
N2080 P460=120.00000
N2090 P461=0.00000
N2100 P462=0.00000
N2110 L=POSBV
N2120 P502=1
N2130 P466=449.27857
N2140 P467=171.53494
N2150 P460=120.00000
N2160 P461=0.00000
N2170 P462=0.00000
N2180 L=POSBV
N2190 P502=1
N2200 P466=111.54242
N2210 P467=264.45706
N2220 P460=120.00000
N2230 P461=0.00000
N2240 P462=0.00000
N2250 L=POSBV
N2260 P502=1
N2270 P466=99.03368
N2280 P467=91.12157
N2290 P460=120.00000
N2300 P461=0.00000
N2310 P462=0.00000
N2320 L=POSBV
:ENDFOR

:99999
N2330 L=PFINE
%

这可以通过replace来完成:

with open('filename.txt', 'r+') as f:
    text = f.read() # read everything in the file
    blocks = text.split('ENDFOR') #split text in blocks
    blocks = [i + 'ENDFOR' for i in blocks[:-1] if i] + [blocks[-1]] #add endfors 
    new_blocks = [block.replace("N1530 M136","N1530 M128").replace("N1710 M137","N1710 M129") if 'ST1="803"' in block else block for block in blocks]
    new_text = ''.join(new_blocks)
    with open('output.txt', 'w') as fn: #write to file
        fn.write(new_text)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM