如何在Python中获取匹配行后的行
我最近在用Python,算是个业余爱好者。抱歉如果这个问题听起来很傻,但我想知道有没有简单的方法来抓取一些行,假设输入文件的格式是这样的:
" 标题 1
第一行
第二行
第三行
标题 2
第一行
第二行
第三行 "
我不知道每个标题后面有多少行,但我想把它们全部抓取下来。我只知道标题的名字,或者一个正则表达式模式。
我知道的读取文件的方法是“for line in file:”这种方式,但我不知道怎么抓取当前行之后的行。希望这样说能让你明白,谢谢你的帮助!
*感谢大家的回复!我试着实现了一些解决方案,但我的问题是并不是所有的标题名字都一样,我不确定该怎么处理。每个标题我都需要不同的正则表达式……有什么建议吗?*
4 个回答
1
除了使用生成器之外,我觉得我们可以创建一个字典,字典的键是“标题”,而值是一个列表,用来保存每一行的内容。下面是代码:
odd_map = {}
odd_list = []
with open(file, 'r') as myFile:
lines = myFile.readlines()
for line in lines:
if "Heading" in line:
odd_list = []
odd_map[line.strip()] = odd_list
else:
odd_list.append(line.strip())
for company, odds in odd_map.items():
print(company)
for odd in odds:
print(odd)
4
你可以用一个变量来标记你现在正在跟踪哪个标题,如果这个变量被设置了,就可以抓取每一行,直到你找到另一个标题为止:
data = {}
for line in file:
line = line.strip()
if not line: continue
if line.startswith('Heading '):
if line not in data: data[line] = []
heading = line
continue
data[heading].append(line)
这里有一个示例,展示了它是如何工作的:http://codepad.org/KA8zGS9E
编辑:如果你不在乎实际的标题内容,只想在最后得到一个列表,你可以这样做:
data = []
for line in file:
line = line.strip()
if not line: continue
if line.startswith('Heading '):
continue
data.append(line)
基本上,你其实不需要跟踪标题的变量,而是可以直接过滤掉所有符合标题模式的行。
7
生成器函数
def group_by_heading( some_source ):
buffer= []
for line in some_source:
if line.startswith( "Heading" ):
if buffer: yield buffer
buffer= [ line ]
else:
buffer.append( line )
yield buffer
with open( "some_file", "r" ) as source:
for heading_and_lines in group_by_heading( source ):
heading= heading_and_lines[0]
lines= heading_and_lines[1:]
# process away.