2

Python 2.7でこれを作成しようとしています:

>>> s = u"some\u2028text"
>>> s
u'some\u2028text'
>>> l = s.splitlines(True)
>>> l
[u'some\u2028', u'text']

\u2028\rまたはではなく、左から右への埋め込み文字で\nあるため、行が分割されません。バグですか、それとも私の誤解ですか?

4

2 に答える 2

6

\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;
}
于 2013-08-20T00:18:29.197 に答える
2

U+2028ですLINE SEPARATORU+2028U+2029( PARAGRAPH SEPARATOR)は両方とも改行として扱われるべきなので、Python は正しいことをしています。

もちろん、非標準の改行文字リストで分割したいというのは、完全に理にかなっている場合もあります。しかし、あなたはそれを行うことはできませんsplitlines。を使用splitする必要があり、 の追加機能が必要な場合はsplitlines、自分で実装する必要があります。例えば:

return [line.rstrip(sep) for line in s.split(sep)]
于 2013-08-20T00:20:42.143 に答える