5

Python で段落を分割するために使用する正規表現をどのように記述しますか?

段落は 2 つの改行 (\n) で定義されます。ただし、改行と一緒に任意の量のスペース/タブを含めることができ、それでも段落と見なす必要があります。

私はpythonを使用しているので、ソリューションは拡張されたpythonの正規表現構文を使用できます。(?P...)ものを利用することができます)

例:

the_str = 'paragraph1\n\nparagraph2'
# splitting should yield ['paragraph1', 'paragraph2']

the_str = 'p1\n\t\np2\t\n\tstill p2\t   \n     \n\tp3'
# should yield ['p1', 'p2\t\n\tstill p2', 'p3']

the_str = 'p1\n\n\n\tp2'
# should yield ['p1', '\n\tp2']

私ができる最高のものは: r'[ \t\r\f\v]*\n[ \t\r\f\v]*\n[ \t\r\f\v]*'、すなわち

import re
paragraphs = re.split(r'[ \t\r\f\v]*\n[ \t\r\f\v]*\n[ \t\r\f\v]*', the_str)

しかし、それは醜いです。もっと良いものはありますか?

編集

拒否された提案:

r'\s*?\n\s*?\n\s*?'\s-> includesであるため、例 2 と 3 は失敗する\nため、2 を超える段落区切りが許可され\nます。

4

5 に答える 5

5

残念ながら、「改行ではなく空白」と書く良い方法はありません。

あなたができる最善のことは、x修飾子でスペースを追加し、醜さを少し取り除くことだと思いますが、それは疑わしいです:(?x) (?: [ \t\r\f\v]*? \n ){2} [ \t\r\f\v]*?

文字クラスだけのサブルールを作成して、それを 3 回補間することもできます。

于 2008-09-22T18:28:47.923 に答える
2

単純なテストでドキュメントの構造を推測しようとしていますか? docutilsと同じことをしていますか?

独自のパーサーを作成するのではなく、単純にDocutils パーサーを使用できる場合があります。

于 2008-09-22T18:28:28.067 に答える
2

正規表現ではありませんが、非常にエレガントです:

from itertools import groupby

def paragraph(lines) :
    for group_separator, line_iteration in groupby(lines.splitlines(True), key = str.isspace) :
        if not group_separator :
            yield ''.join(line_iteration)

for p in paragraph('p1\n\t\np2\t\n\tstill p2\t   \n     \n\tp'): 
    print repr(p)

'p1\n'
'p2\t\n\tstill p2\t   \n'
'\tp3'

もちろん、必要に応じて出力を削除するのはあなた次第です。

有名な「Python クックブック」からインスパイアされました ;-)

于 2008-09-23T20:54:44.837 に答える
0

ほぼ同じですが、貪欲でない量指定子を使用し、空白シーケンスを利用しています。

\s*?\n\s*?\n\s*?
于 2008-09-22T18:18:09.633 に答える
0

参考までに: この種の問題に対する 2 つの解決策を別のスレッドに書きました。最初にここで要求されているように正規表現を使用し、次に入力を一度に 1 行ずつストリーミングするステート マシン アプローチを使用します。

https://stackoverflow.com/a/64863601/5201675

于 2020-11-16T19:33:42.847 に答える