一个相当特殊的txt文件解析

时间:2016-06-07 14:44:18

标签: python python-3.x parsing

很好的stackOverflow人,我的问题是关于解析的广泛主题。我想要获取的信息位于每个外观上由开始和结束标题(特殊字符串)标记的文本文件上的多个位置。我希望得到这些标题之间的所有内容。到目前为止我实现的代码似乎非常低效(尽管速度不慢),正如你在下面看到的那样,使用了两个while语句。

with open(sessionFile, 'r') as inp_ses:
    curr_line = inp_ses.readline()
    while 'ga_group_create' not in curr_line:
        curr_line = inp_ses.readline()
    set_name = curr_line.split("\"")[1]
    recording = []
    curr_line = inp_ses.readline()
    # now looking for the next instance
    while 'ga_group_create' not in curr_line:
        recording.append(curr_line)
        curr_line = inp_ses.readline()

不要注意开始和结束标题是相同的字符串(只需将它们称为"开始"和#34;结束")。上面的代码只在第一次出现时才给我标题之间的文字。我可以修改它,通过跟踪每个实例中增加的变量,修改我的while语句等来给我剩下的部分,但所有这些感觉就像尝试重新发明轮子一样,也是非常糟糕的。

我有什么可以使用的吗?

2 个答案:

答案 0 :(得分:2)

Oye温柔的堆栈旅行者。时间到来让你使用正则表达式的力量

基本用法

import re
m = re.search('start(.*?)end', 'startsecretend')
m.group(1)
'secret'
  • .匹配任何字符
  • *重复任意次数
  • ?使非贪婪,即它不会捕获'end'
  • ( )表示群组或捕获

更多Python re manual

答案 1 :(得分:1)

我同意正则表达式是一个很好的方式去这里,但这是一个更直接的应用程序来解决你的问题:

import re

options = re.DOTALL | re.MULTILINE
contents = open('parsexample.txt').read()    
m = re.search('ga_group_create(.*)ga_group_create', contents, 
              options)    
lines_in_between = m.groups(0)[0].split()

如果你有几个这样的组,你可以迭代它们:

for m in re.finditer('ga_group_create(.*?)ga_group_create', contents, options):
    print(m.groups(0)[0].split())

请注意,我已使用*?进行非贪婪匹配。