我在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,我似乎无法做对。有什么帮助吗?
答案 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']