使用python regex将文本拆分为多个部分

时间:2014-01-11 17:38:44

标签: python regex text

我有一个大的多行字符串,其中有多个条目遵循类似的格式。我想把它拆分成每个条目的字符串列表。

我尝试了以下内容:

myre = re.compile('Record\sTime.*-{5}', re.DOTALL)
return re.findall(myre, text)

在这种情况下,条目以“记录时间”开头,以“-----”结束。上面的代码不是按照我的意思行事,而是返回一个项目,从第一个条目的开头开始,到最后一个条目的结尾。

我可能会找到一种方法来通过使用正则表达式来查找段的结尾,然后从原始文本的片段开始重复,但这看起来很混乱。

3 个答案:

答案 0 :(得分:5)

您需要通过添加问号将.*变为不情愿的匹配:

.*?

否则它会尽可能多地匹配,从第一个记录的中间到最后一个记录的中间。

请参阅Greedy vs. Reluctant vs. Possessive Quantifiers

答案 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}')