7

给定一个未知来源的文本字符串,如何最好地将其重写为具有已知的 lineend 约定?

我通常这样做:

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

...但这不能处理完全混乱的约定的“混合”文本文件(是的,它们仍然存在!)。

编辑

我正在做的oneliner当然是:

'\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行。在混合上下文中,splitlines 假定 '\r\n' 是单个逻辑换行符,导致最后两个测试用例有4行。

嗯,可以通过比较 splitlines() 和 split('\n') 和/或 split('\r') 的结果来检测包含 '\r\n' 的混合上下文...

4

3 回答 3

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

should handle all possible variants.

于 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(),不会将列表拆分两次或任何东西。

您可以粘贴给您带来麻烦的那种输入示例吗?

于 2009-11-17T15:14:46.557 回答
0

还有比\r\n\and更多的约定\n吗?如果您不想要线条,只需更换\r\n就足够了。

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