很好的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语句等来给我剩下的部分,但所有这些感觉就像尝试重新发明轮子一样,也是非常糟糕的。
我有什么可以使用的吗?
答案 0 :(得分:2)
Oye温柔的堆栈旅行者。时间到来让你使用正则表达式的力量
基本用法
import re
m = re.search('start(.*?)end', 'startsecretend')
m.group(1)
'secret'
.
匹配任何字符*
重复任意次数?
使非贪婪,即它不会捕获'end'
( )
表示群组或捕获答案 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())
请注意,我已使用*?
进行非贪婪匹配。