我有一个大的多行字符串,其中有多个条目遵循类似的格式。我想把它拆分成每个条目的字符串列表。
我尝试了以下内容:
myre = re.compile('Record\sTime.*-{5}', re.DOTALL)
return re.findall(myre, text)
在这种情况下,条目以“记录时间”开头,以“-----”结束。上面的代码不是按照我的意思行事,而是返回一个项目,从第一个条目的开头开始,到最后一个条目的结尾。
我可能会找到一种方法来通过使用正则表达式来查找段的结尾,然后从原始文本的片段开始重复,但这看起来很混乱。
答案 0 :(得分:5)
您需要通过添加问号将.*
变为不情愿的匹配:
.*?
否则它会尽可能多地匹配,从第一个记录的中间到最后一个记录的中间。
答案 1 :(得分:1)
这样的事情:
txt='''\
Record Time
1
2
3
-----
Record Time
4
5
-----
Record Time
6
7
8
'''
import re
pat=re.compile(r'^Record Time$(.*?)(?:^-{5}|\Z)', re.S | re.M)
for i, block in enumerate((m.group(1) for m in pat.finditer(txt))):
print 'block:', i
print block.strip()
打印:
block: 0
1
2
3
block: 1
4
5
block: 2
6
7
8
答案 2 :(得分:1)
你可以使用它来避免不情愿的量词,这是模仿原子组的一个技巧:(?=(...))\1
。它不是完全在主题中,但它可以是有用的:
myre = re.compile('Record\sTime(?:(?=([^-]+|-(?!-{4})))\1)+-{5}')