尝试在 Python 2.7 中做到这一点:
>>> s = u"some\u2028text"
>>> s
u'some\u2028text'
>>> l = s.splitlines(True)
>>> l
[u'some\u2028', u'text']
\u2028
是 Left-To-Right Embedding 字符,而不是\r
or \n
,因此不应分割该行。是有错误还是只是我的误解?
\u2028
是 LINE SEPARATOR,从左到右的嵌入是\u202A
:
>>> import unicodedata
>>> unicodedata.name(u'\u2028')
'LINE SEPARATOR'
>>> unicodedata.name(u'\u202A')
'LEFT-TO-RIGHT EMBEDDING'
在 python 源代码(python 2.7,我的评论)中很容易看到被认为是换行符的代码点列表(虽然不是那么容易找到):
/* Returns 1 for Unicode characters having the line break
* property 'BK', 'CR', 'LF' or 'NL' or having bidirectional
* type 'B', 0 otherwise.
*/
int _PyUnicode_IsLinebreak(register const Py_UNICODE ch)
{
switch (ch) {
// Basic Latin
case 0x000A: // LINE FEED
case 0x000B: // VERTICAL TABULATION
case 0x000C: // FORM FEED
case 0x000D: // CARRIAGE RETURN
case 0x001C: // FILE SEPARATOR
case 0x001D: // GROUP SEPARATOR
case 0x001E: // RECORD SEPARATOR
// Latin-1 Supplement
case 0x0085: // NEXT LINE
// General punctuation
case 0x2028: // LINE SEPARATOR
case 0x2029: // PARAGRAPH SEPARATOR
return 1;
}
return 0;
}
U+2028
是LINE SEPARATOR
。U+2028
和U+2029
( PARAGRAPH SEPARATOR
)都应该被视为换行符,因此 Python 正在做正确的事情。
当然,有时想要在非标准的换行符列表上进行拆分是完全合理的。但是你不能用splitlines
. 您将不得不使用split
— 并且,如果您需要 的附加功能splitlines
,您必须自己实现它们。例如:
return [line.rstrip(sep) for line in s.split(sep)]