7

ソースが不明なテキスト文字列が与えられた場合、それをどのように書き換えて、既知の行末規則を持つようにするのが最善でしょうか?

私は通常、次のことを行います。

lines = text.splitlines()
text = '\n'.join(lines)

...しかし、これは完全に混乱した規則の「混合」テキストファイルを処理しません (はい、それらはまだ存在します!)。

編集

もちろん、私がやっていることのワンライナーは次のとおりです。

'\n'.join(text.splitlines())

……それは私が求めているものではありません。

その後、行の総数は同じになるはずなので、空の行が削除されることはありません。

テストケース

分割

'a\nb\n\nc\nd'
'a\r\nb\r\n\r\nc\r\nd'
'a\rb\r\rc\rd'
'a\rb\n\rc\rd'
'a\rb\r\nc\nd'
'a\nb\r\nc\rd'

.. すべて5行になるはずです。混合コンテキストでは、分割行は '\r\n' が単一の論理改行であると想定し、最後の 2 つのテストケースで4行になります。

'\r\n' を含む混合コンテキストは、splitlines() と split('\n') および/または split('\r') の結果を比較することで検出できます...

4

3 に答える 3

16
mixed.replace('\r\n', '\n').replace('\r', '\n')

考えられるすべてのバリアントを処理する必要があります。

于 2009-11-17T16:04:07.003 に答える
7

...しかし、これは完全に混乱した規則の「混合」テキストファイルを処理しません (はい、それらはまだ存在します!)

実際にはうまくいくはずです:

>>> s = 'hello world\nline 1\r\nline 2'

>>> s.splitlines()
['hello world', 'line 1', 'line 2']

>>> '\n'.join(s.splitlines())
'hello world\nline 1\nline 2'

Python のどのバージョンを使用していますか?

編集:私はまだあなたのためにどのように機能していないsplitlines()のかわかりません:

>>> s = '''\
... First line, with LF\n\
... Second line, with CR\r\
... Third line, with CRLF\r\n\
... Two blank lines with LFs\n\
... \n\
... \n\
... Two blank lines with CRs\r\
... \r\
... \r\
... Two blank lines with CRLFs\r\n\
... \r\n\
... \r\n\
... Three blank lines with a jumble of things:\r\n\
... \r\
... \r\n\
... \n\
... End without a newline.'''

>>> s.splitlines()
['First line, with LF', 'Second line, with CR', 'Third line, with CRLF', 'Two blank lines with LFs', '', '', 'Two blank lines with CRs', '', '', 'Two blank lines with CRLFs', '', '', 'Three blank lines with a jumble of things:', '', '', '', 'End without a newline.']

>>> print '\n'.join(s.splitlines())
First line, with LF
Second line, with CR
Third line, with CRLF
Two blank lines with LFs


Two blank lines with CRs


Two blank lines with CRLFs


Three blank lines with a jumble of things:



End without a newline.

私が知る限りsplitlines()、リストを 2 回または何かに分割することはありません。

問題を起こしている種類の入力のサンプルを貼り付けてもらえますか?

于 2009-11-17T15:14:46.557 に答える
0

とよりもさらに多くの変換が\r\n\あり\nますか? 行が必要ない場合は、単に置き換えるだけ\r\nで十分です。

only_newlines = mixed.replace('\r\n','\n')
于 2009-11-17T15:20:08.167 に答える