use*_*268 1 python regex parsing
我是Python的新手.我经常使用Perl并且听说Python在解析文本方面经常更好,所以我想尝试一下,但是我无法找到最简单的方法(对于信息,我已经在Perl中做过了,但是它带走了几个缓慢而丑陋的循环:
我想读取一个大文件并提取两个以相同模式开头的行之间的文本块,例如:
!NAME: "N0", DESCR: "Netnt Etrnet"
!NAME: "cp0", DESCR: "Cle R0"
!NAME: "slt R1", DESCR: "RSt"
>>!NAME: "moe R1", DESCR: "ASessor 1,bps"
>>!PID: A9-55
>>!VID: G0984981
>>!SN: SEDGH25443N51E
!NAME: "SDFGSDFG: FGT/0", DESCR: "VFDFGX1"
!NAME: "JQFHF1", DESCR: "VNQDF2"
Run Code Online (Sandbox Code Playgroud)
当然">>"不是文本文件的一部分,它只是为了显示我想要检索的行.
所以回顾一下:我想要打印所有块(文件中有更多的块),块的第一行以"!NAME"开头,并在下一个"!NAME"之前有其他行.
我不关心连续两个"!NAME:"的块.
这只是第一步,稍后我将尝试检索此块的值以创建散列(或字典或任何等效于python中的散列).但是我已经陷入了第一步所以我正在寻求帮助哈哈.
谢谢 !
with open("in.txt") as f:
prev = ""
for line in f:
if not line.startswith("!NAME:"):
print(prev.rstrip())
print(line.rstrip())
for line in f:
if line.startswith("!NAME:"):
prev = line
break
print(line.rstrip())
prev = line
prev = line
Run Code Online (Sandbox Code Playgroud)
如果您希望存储每个部分,可以使用dict:
from itertools import count
from collections import defaultdict
cn = count()
sections = defaultdict(str)
with open("log.txt") as f:
prev = ""
for line in f:
if not line.startswith("!NAME:"):
key = next(cn)
sections[key] += prev
sections[key] += line
for line in f:
if line.startswith("!NAME:"):
break
sections[key] += line
prev = line
prev = line
print(d)
defaultdict(<class 'str'>, {0: '!NAME: "moe R1", DESCR: "ASessor 1,bps"\n!PID: A9-55\n!VID: G0984981\n!SN: SEDGH25443N51E\n'})
Run Code Online (Sandbox Code Playgroud)
要确保只找到具有前一个!名称的部分,请确保上一行以!名称开头!
with open("log.txt") as f:
prev = ""
for line in f:
if not line.startswith("!NAME:") and prev.startswith("!NAME:"):
key = next(cn)
sections[key] += prev
sections[key] += line
for line in f:
if line.startswith("!NAME:"):
break
sections[key] += line
prev = line
prev = line
Run Code Online (Sandbox Code Playgroud)