Как преобразовать строку unicode в строковые литералы в Python 2.7?

Python2.7: Я хотел бы сделать что-то необычное. Большинство людей хотят преобразовать строковые литералы в более удобочитаемые строки. Я хотел бы преобразовать следующий список строк Юникода в свои литературные формы:

  • Hallöchen
  • Straße
  • Gemüse
  • freø̯̯nt

к их кодовым точкам, которые выглядят примерно так:

\ U3023 \ u2344

Вы заметите, что у freø̯̯nt есть два перевернутых бревен ниже ø. Я хотел бы обратить особое внимание на это слово в его буквальную форму, чтобы я мог использовать REGEX для удаления лишнего.

Я не уверен, что такое терминология для этих вещей – пожалуйста, исправьте меня, если я ошибаюсь.

Вы заметите, что у freø̯̯nt есть два перевернутых бревен ниже ø. Я хотел бы обратить особое внимание на это слово в его буквальную форму, чтобы я мог использовать REGEX для удаления лишнего.

В этом случае вам не нужен codecs.encode(unicode_string, 'unicode-escape') . В строковых литералах нет строковых литералов.

Строка Unicode представляет собой последовательность кодовых точек Unicode в Python. Те же воспринимаемые пользователем символы могут быть записаны с использованием разных кодовых точек, например, 'Ç' может быть записано как u'\u00c7' и u'\u0043\u0327' .

Вы можете использовать форму нормализации Unicode NFKD чтобы убедиться, что «breves» являются отдельными, чтобы не пропустить их при их дублировании:

 #!/usr/bin/env python # -*- coding: utf-8 -*- import re import unicodedata s = u"freø̯̯nt" # remove consecutive duplicate "breves" print(re.sub(u'\u032f+', u'\u032f', unicodedata.normalize('NFKD', s))) 

Не могли бы вы объяснить, почему ваша команда re.sub не имеет +1 для обеспечения того, что строки являются последовательными символами? (как ответ @Paulo Freitas )

re.sub('c+', 'c', text) гарантирует, что в re.sub('c+', 'c', text) нет 'cc', 'ccc', 'cccc' и т. д. Иногда регулярное выражение делает ненужную работу, заменяя 'c' на 'c' . Но результат тот же: не последовательный дубликат 'c' в тексте.

Регулярное выражение из ответа @Paulo Freitas также должно работать:

 no_duplicates = re.sub(u'(\u032f)\\1+', r'\1', unicodedata.normalize('NFKD', s)) 

Он выполняет замену только для дубликатов. Вы можете измерить производительность по времени и посмотреть, какое регулярное выражение работает быстрее, если это узкое место в вашем приложении.

Вы можете использовать функцию str.encode ([encoding [, errors]]) с кодировкой unicode_escape :

 >>> s = u'freø̯̯nt' >>> print(s.encode('unicode_escape')) b'fre\\xf8\\u032f\\u032fnt'