Как разделить строку на непечатаемый символ ascii в Python

Как я могу разделить строку в Python на непечатаемый символ ascii (например, длинный шестнадцатеричный знак минус 0x97, восьмеричный 227)? Сам персонаж мне не понадобится. Информация после нее будет сохранена как переменная.


person d-cubed    schedule 29.05.2010    source источник


Ответы (3)


Вы можете использовать re.split.

>>> import re
>>> re.split('\W+', 'Words, words, words.')
['Words', 'words', 'words', '']

Настройте шаблон, чтобы он включал только те символы, которые вы хотите сохранить.

См. также: -строка-в-питоне


Пример (с длинным минусом):

>>> # \xe2\x80\x93 represents a long dash (or long minus)
>>> s = 'hello – world'
>>> s
'hello \xe2\x80\x93 world'
>>> import re
>>> re.split("\xe2\x80\x93", s)
['hello ', ' world']

Или то же самое с юникодом:

>>> # \u2013 represents a long dash, long minus or so called en-dash
>>> s = u'hello – world'
>>> s
u'hello \u2013 world'
>>> import re
>>> re.split(u"\u2013", s)
[u'hello ', u' world']
person miku    schedule 29.05.2010
comment
Как мне указать, что я хочу разделить точно по шестнадцатеричному символу 97? - person d-cubed; 29.05.2010
comment
-1 (0) OP имеет EM DASH (U+2014, cp1252 x97), а не EN DASH (U+2013, cp1252 0x96). (1) Ваш второй пример относится к UTF-8, который, очевидно (??) OP не использует (2) Использование re.split вместо str.split является грубым излишеством. - person John Machin; 31.05.2010

_, _, your_result= your_input_string.partition('\x97')

or

your_result= your_input_string.partition('\x97')[2]

Если your_input_string не содержит '\x97', то your_result будет пустым. Если your_input_string содержит несколько символов '\x97', your_result будет содержать все после первого символа '\x97', включая другие символы '\x97'.

person tzot    schedule 30.05.2010

Просто используйте метод разделения строки/юникода (им на самом деле не нужна строка, на которую вы разделяете (кроме того, что это константа. Если вы хотите использовать регулярное выражение, используйте re.split)

Чтобы получить разделенную строку, либо экранируйте ее, как другие люди показали "\ x97"

или

используйте chr(0x97) для строк (0-255) или unichr(0x97) для юникода

так что пример будет

'will not be split'.split(chr(0x97))

'will be split here:\x97 and this is the second string'.split(chr(0x97))
person Terence Honles    schedule 29.05.2010
comment
Спасибо. Мне нравится использование chr(). - person d-cubed; 30.05.2010
comment
(0) Вы имеете в виду метод разделения str/unicode (1), кроме того, что он является константой: это может быть любое выражение, которое оценивается как одна строка (например, chr(0x97)) (2) использование [uni]chr(0x97) instead of [u]"\x97" является запутанным/избыточным/расточительным /deprecable (ИМХО) -- вы бы написали float("1.23") вместо 1.23?? (3) Если бы он работал в юникоде, ему не нужно было бы unichr(0x97), ему нужно было бы u"\u2014", то есть "\x97".decode("cp1252") - person John Machin; 31.05.2010
comment
(0) В моем английском объяснении мне действительно нужно указать, что это метод str, а не метод, который работает со строкой... который является класс str??? (1) это константа, означающая, что строка не может указывать более одной строки (chr (97) всегда будет «\ x97»), где re.split может обрабатывать «\ x97 | \ x91». КОНЕЧНО вы можете написать chr(i), где i — переменная, которая может изменяться. (2) Да... конечно, вы бы не сделали преобразование с плавающей запятой, но chr может быть полезен, если ему нужно преобразовать число в строку во время выполнения. - person Terence Honles; 31.05.2010
comment
(3) И нет, я не проверял, что такое 0x97 в юникоде... зачем мне это? он попросил 0x97... Я дал ему это. Он должен выяснить, что шестнадцатеричные значения символов в ASCII отличаются от юникода (я просто показывал, что существует существует эквивалент, который будет генерировать строку символов юникода) - person Terence Honles; 31.05.2010
comment
(0) строка является экземпляром типа str ИЛИ типа unicode (1) константа != только одна строка (3) Вам не нужно проверять, что 0x97 было в unicode... символы в диапазоне U+0080 до U+009F — управляющие символы C1, ничего общего с тире. Если они есть в ваших данных юникода, вы либо работаете с каким-то древним/мистическим протоколом (вероятность = 0,001), либо какой-то валли декодировал с использованием latin1 вместо cp1252 (вероятность = 0,999). Первые 128 символов Unicode были намеренно сделаны такими же, как ASCII; шестнадцатеричные значения символов в ASCII НЕ отличаются от юникода. 0x97 не в ASCII. - person John Machin; 31.05.2010
comment
Я все еще думаю, что вы немного слишком придирчивы к строковым вещам, и я немного опасался помещать константу, когда писал ее (я думал, что из контекста было очевидно, что это был не повтор). Что ж, спасибо за ваше знание юникода... Я особо им не пользовался. И, наконец, я боялся, что вы это поднимете (я не был на 100% уверен в отображении символов из ASCII в юникод)... и насчет 0x97, это именно, если вы используете расширенный ASCII (который я включил, когда писал комментарий, потому что я уже написал более одного комментария) - person Terence Honles; 31.05.2010
comment
Знание Unicode: вы можете прочитать amk.ca/python/howto/unicode и ссылки (особенно статьи Чиборры, Спольски и Орендорфа). расширенный ASCII не является очень техническим описанием и не имеет смысла без какого-либо указания (например, путем присвоения имени кодировке), что означают кодовые точки от 0x80 до 0xFF. Я не понимаю, почему вы используете ASCII, когда вы имели в виду расширенный ASCII (потому что я уже написал более одного комментария). - person John Machin; 31.05.2010
comment
Прошу прощения, если неправильно описал персонажа. cat -e показал «M-^W», что дало восьмеричное значение 227, которое, как я нашел в гугле, было эквивалентно: U + 0097, символ -, десятичное 151, шестнадцатеричное 0x97, восьмеричное \ 227, двоичное 10010111 - person d-cubed; 31.05.2010
comment
@Donnied: Вы правильно описали персонажа; вы дали достаточно информации (длинный знак минус). Однако вы СЕЙЧАС ошибаетесь; U+0097 — это (как я писал выше) управляющий символ, а не тире/минус. кошка -е? Что это такое? В контексте Python 2.x print repr(your_data) однозначно показывает, что у вас есть; попробуйте использовать его, когда будете задавать свой следующий вопрос. - person John Machin; 01.06.2010
comment
cat -e — это команда Linux, которую я использовал, чтобы увидеть, что происходит. Бит U + 0097 был тем, что гуглило для значения восьмеричного \ 227. u0097 — управляющий символ — почему он указан как эквивалент? Спасибо за внимание. - person d-cubed; 01.06.2010
comment
u0097 — управляющий символ — почему он указан как эквивалент? Пожалуйста, не удивляйтесь: некоторые люди, пишущие статьи, которые вы можете найти с помощью Google, на несколько сэндвичей не дотягивают до пикника :-) См. мои комментарии о расширенном ASCII и кодировании выше. Также прочитайте статьи, которые я рекомендовал Теренсу. - person John Machin; 02.06.2010