Python正则表达式拆分多行包含模式

时间:2012-12-14 02:41:37

标签: python regex include split multiline

我在python中收到类似于这种格式的数据

garbage
=== Season 1 ===
season 1 data
more season 1 data
=== Season 2 ===
season 2 data

有换行符,但'=== Season x ==='之间的数据没有定义(如果你知道的话,它来自维基百科的API)。

无论如何,我正试图用正则表达式来解决它,但似乎无法做到正确。我试试

p = re.compile('(===\sSeason.*)'
print p.split(data)

并获取

['garbarge\n', '=== Season 1 ===', '\nseason 1 data\nmore season 1 data\n\n', '=== Season 2 ===', '\nseason 2 data\n']

但我正在寻找的是:

['garbarge\n', '=== Season 1 ===\nseason 1 data\nmore season 1 data\n\n', '=== Season 2 ===\nseason 2 data\n']

每个模式包括文本直到下一个模式,换行符和所有。我已经尝试过re.MULTILINE的组合,re.DOTALL,我似乎无法做对。有什么帮助吗?

2 个答案:

答案 0 :(得分:2)

一种直接的方法是逐行逐步浏览内容:

season = ''
for line in data.splitlines():
    if line.startswith('=== Season'):
        season = line
    elif season:
        do something

答案 1 :(得分:1)

不确定为什么不能正常工作,但这似乎对我有用:

>>> data = """
garbage
=== Season 1 ===
season 1 data
more season 1 data
=== Season 2 ===
season 2 data
"""
>>> re.split('^===\sSeason\s\d+\s===$',data,0,re.MULTILINE)
['\ngarbage\n', '\nseason 1 data\nmore season 1 data\n', '\nseason 2 data\n']
哦,那不是你想要的吗?但split剥离了你分裂的东西;如果你想保留它,那么你就没有使用正确的工具来完成工作。

这是另一个更复杂的解决方案,它过滤掉了“垃圾”,但保留了季节信息:

>>> re.findall('=== Season \d+ ===.*?(?=^===|\Z)',data,re.DOTALL|re.MULTILINE)
['=== Season 1 ===\nseason 1 data\nmore season 1 data\n', '=== Season 2 ===\nseason 2 data\n']