初心者にとって最も簡単な解決策は、おそらく Steve が提案した方法です。行を繰り返し、フラグを使用して、最後の行が空白行であったかどうかを追跡します。
しかし、より高いレベルの解決策が必要な場合は、より高いレベルで問題を再考する必要があります。実際に指定しようとしているのは、すべての段落の最初の行ですが、「段落」は空の行で区切られたものです。右?
それで、どうすればそれができますか?まあ、 on と'\n\n'
同じくらい簡単に分割できます\n
。そう:
paragraphs = document.split('\n\n')
first_lines = [paragraph.partition('\n')[0] for paragraph in paragraphs]
popped_lines = first_lines[1:]
(ここではpartition
代わりにsplit
両方を使用しました。これは、最初の でのみ分割され'\n'
、残りはそのままであり、1 行の段落を正しく処理するためです。これはそうでparagraph.split('\n', 1)
はありません。)
しかし、ポップされた行のリストは必要ありません。ポップされた行以外のすべてのリストが必要ですよね?
paragraphs = document.split('\n\n')
first, rest = paragraphs[0], paragraphs[1:]
rest_edited = [paragraph.partition('\n')[1] for paragraph in rest]
そして、それをドキュメントに戻したい場合:
all_edited = [first] + rest_edited
document_edited = '\n\n'.join(all_edited)
スライス割り当てを使用して少し短くすることができますが、読みやすいかどうかはわかりません。
paragraphs = document.split('\n\n')
paragraphs[1:] = [paragraph.partition('\n')[1] for paragraph in paragraphs[1:]]
document_edited = '\n\n'.join(paragraphs)
JF Sebastian が指摘するように、質問は少しあいまいです。「空白行」は「空の行」または「空白しかない行」を意味しますか? 後者の場合、物事はもう少し複雑になります。最も簡単な解決策はr'\n\s*\n'
、おそらく段落に分割するための単純な正規表現 ( ) です。
一方、1 つの大きな文字列ではなく、行のシーケンス (ファイルは行のシーケンスであることに注意してください!) がある場合は、いくつかの異なる方法で、まったく分割せずにこれを行うことができます。
たとえば、段落は空白ではない行のグループですよね? したがって、groupby
関数を使用してそれらを取得できます。
groups = itertools.groupby(lines, bool)
または、「空白」が「空」を意味しない場合:
groups = itertools.groupby(lines, lambda line: not line.strip())
これにより(False, <sequence of lines>)
、各段落と(True, <sequence of blank lines>)
各空白行が得られることに注意してください。空白行をそのまま保持したい場合は可能ですが、空白行の各実行を単一の空白行に置き換えるだけで満足している場合 (「空白」が「空」を意味する場合は明らかにそうです)、おそらく空白の段落を簡単に捨てることができます:
paragraphs = (group for (key, group) in paragraphs if not key)
次に、最初のグループ以外のすべてから最初の要素を削除し、最後にグループをチェーンして 1 つの大きなシーケンスに戻すことができます。
first = next(paragraphs)
edited_paragraphs = (itertools.islice(paragraph, 1) for paragraph in paragraphs)
edited_document = itertools.chain(first, *edited_paragraphs)
最後に、連続して複数の空白行がある場合はどうなるでしょうか? まず、それらに対処する方法を決定する必要があります。空行が 2 行ある場合、2 行目は削除しますか? その場合、次の段落の最初の行を削除しますか (最初は空白行の後にあったため)、削除しませんか (その後の空白行が既に削除されているため)。3つ並んだらどうする?分割する'\n\n'
と、あること、別のことが分割され'\n\s*\n'
、groupby
さらに別のことが行われます... しかし、何が必要かがわかるまで、どちらが「正しい」か、または他のものを「修正」する方法を言うことはもちろん不可能です.