Преобразование символов Юникод полной ширины в символы ASCII - PullRequest
0 голосов
/ 08 июня 2018

У меня есть строковый текст в Юникоде, содержащий некоторые цифры, как показано ниже:

txt = '36fsdfdsf14'

Однако int(txt[:2]) не распознает символы как числа.Как изменить символы, чтобы они распознавались как числа?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Если у вас действительно есть Unicode (или вы расшифровываете свою байтовую строку в Unicode), то вы можете нормализовать данные с помощью канонической замены:

>>> s = u'36fsdfdsf14'
>>> s
u'\uff13\uff16fsdfdsf\uff11\uff14'
>>> import unicodedata as ud
>>> ud.normalize('NFKC',s)
u'36fsdfdsf14'

Если каноническая нормализация слишком сильно изменится для вас, вы можете сделатьтаблица перевода нужных вам замен:

#coding:utf8

repl = u'0123456789'

# Fullwidth digits are U+FF10 to U+FF19.
# This makes a lookup table from Unicode ordinal to the ASCII character equivalent.
xlat = dict(zip(range(0xff10,0xff1a),repl))

s = u'36fsdfdsf14'

print(s.translate(xlat))

Вывод:

36fsdfdsf14
0 голосов
/ 08 июня 2018

На python 3

[int(x) for x in re.findall(r'\d+', '36fsdfdsf14')]
# [36, 14]

На python 2

[int(x) for x in re.findall(r'\d+', u'36fsdfdsf14', re.U)]
# [36, 14]

О примере с python 2 обратите внимание на 'u' перед строкой и флаг re.U.Вы можете преобразовать существующую str типизированную переменную, такую ​​как txt в вашем вопросе, в Unicode как txt.decode('utf8').

...