Python string splitlines () удаляет определенные управляющие символы Юникода
Я заметил, что стандартный строковый метод Python splitlines() фактически удаляет некоторые важные управляющие символы Unicode. Пример
>>> s1 = u'asdf n fdsa x1d asdf'
>>> s1.splitlines()
[u'asdf ', u' fdsa ', u' asdf']
обратите внимание, как символ "x1d " тихо исчезает.
этого не происходит, если строка s1 по-прежнему является Python bytestring, хотя (без префикса "u"):
>>> s2 = 'asdf n fdsa x1d asdf'
>>> s2.splitlines()
['asdf ', ' fdsa x1d asdf']
Я не могу найти никакой информации об этом в ссылка https://docs.python.org/2.7/library/stdtypes.html#str.splitlines.
почему это происходит? Какие еще символы, кроме "x1d" (или unichr(29)), затронуты?
Я использую Python 2.7.3 на Ubuntu 12.04 LTS.
1 ответов
это действительно недокументировано; мне пришлось немного покопаться в исходном коде, чтобы найти его.
case 0x000A:
case 0x000B:
case 0x000C:
case 0x000D:
case 0x001C:
case 0x001D:
case 0x001E:
case 0x0085:
case 0x2028:
case 0x2029:
это генерируется из базы данных Unicode; любая кодовая точка, указанная в стандарте Юникода с Line_Break
свойство имеет значение BK
, CR
, LF
или NL
или с двунаправленной категорией, установленной в B
(абзац) является линия ломать.
С файл данных Unicode, версия 6 стандарта перечисляет U + 001D как разрыв абзаца:
001D;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;;
(5-й столбец-это двунаправленный категории).
вы можете использовать регулярное выражение, Если хотите ограничить, какие символы разделить на:
import re
linebreaks = re.compile(ur'[\n-\r\x85\u2028\u2929]')
linebreaks.split(yourtext)
разделил бы ваш текст на тот же набор linebreaks за исключением для U+001C, U+001D или U + 001E кодовых точек, так что три сведения структурирование управляющих символов.