1

我在 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 的组合,但我似乎无法做到正确。有什么帮助吗?

4

2 回答 2

2

不知道为什么这不完全有效,但这似乎对我有用:

>>> 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']
于 2012-12-14T02:47:45.790 回答
2

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

season = ''
for line in data.splitlines():
    if line.startswith('=== Season'):
        season = line
    elif season:
        do something
于 2012-12-14T02:53:14.457 回答