1

Pythonでこの形式に似たデータを受け取っています

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

改行を使用しますが、「===シーズン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

これを行う簡単な方法は、コンテンツを1行ずつステップスルーすることです。

season = ''
for line in data.splitlines():
    if line.startswith('=== Season'):
        season = line
    elif season:
        do something
于 2012-12-14T02:53:14.457 に答える
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 に答える