迭代两个关键字分隔的条目的最佳方法是什么?

时间:2010-11-20 14:45:22

标签: python string

文本文件内容:

&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

当然不是那么容易。但是,有没有建议以一种简单的方式来迭代两个关键词所划分的条目。

3 个答案:

答案 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模块)。