文本文件内容:
&CRB A='test1' B=123,345, 678 &END
Misc text potentially between entries ...
&CRB A='test2'
B=788, 345, 3424 &END
&CRB A='test3'
B=788, 345, 3424 &END
&CRB A='test4' B=788, 345, 3424 &END
迭代关键字之间条目的最有效方法是什么?注意 一些条目跨越行。需要类似以下内容 -
f = open(filename)
for entry in f:
- do something with entry
当然不是那么容易。但是,有没有建议以一种简单的方式来迭代两个关键词所划分的条目。
答案 0 :(得分:4)
假设该条目是&CRB
和&END
对之间的所有文本,您可以使用以下内容在它们之间提取文本:
import re
# the regular expression treats newlines as a regular character, so the
# multiline entries are okay. It's non-greedy, so it gets individual entries.
pat = re.compile(r'&CRB(.+?)&END', re.DOTALL)
s = ''' &CRB A='test1' B=123,345, 678 &END
Misc text potentially between entries ...
&CRB A='test2'
B=788, 345, 3424 &END
&CRB A='test3'
B=788, 345, 3424 &END
&CRB A='test4' B=788, 345, 3424 &END'''
for entry in pat.findall(s):
# do something with each entry
print entry
打印出来:
A='test1' B=123,345, 678
A='test2'
B=788, 345, 3424
A='test3'
B=788, 345, 3424
A='test4' B=788, 345, 3424
......清理和解释每条记录的内容是你的问题......
答案 1 :(得分:1)
我使用re.finditer
而不是re.findall
,因为我们不知道一次解析它的文件的大小可能过于浪费,而有一个迭代器会产生结果将阻止该程序占用太多内存。
所以我认为最好的解决方案是the one posted by bgporter,在for循环中使用pat.finditer而不是pat.findall。
finditer产生MatchObject
s而不是字符串,以获得匹配的字符串,只需调用.group()
:
for entry in pat.finditer(s):
entry_text = entry.group()
#do something with entry_text.
答案 2 :(得分:0)
我会在文件中读取,使用filecontents.split('& CRB'),然后用正则表达式解析每一行(参见re
模块)。