Форум сайта python.su
0
Всех приветствую!
Подскажите, как упаковать число в юникод, вот нашел код но он на перле:
$str =~ s/&#x([0-9A-F]+?);/pack("U", hex($1))/ge;Офлайн
857
lobsterприведи конкретный пример
Подскажите, как упаковать число в юникод
>>> chr(0x20) ' ' >>> chr(0x1234) 'ሴ' >>>
>>> def f(n): ... return bytes(bytearray((n >> 8, n & 0xff))) ... >>> c = f(0xd0b0).decode('utf-8') >>> print c а >>> c u'\u0430' >>>
Отредактировано py.user.next (Дек. 25, 2012 02:01:43)
Офлайн
0
py.user.next
второй пример работает, только не понятно откуда ты взял 0xd0b0 если кириллическая “a” в юникодном представлении \u0430
Офлайн
0
А вот, все, дошло сделал при помощи unichr() теперь перловый скрипт можно переписать:
#-*- coding: utf-8 -*-
import re
def unic(match):
i = match.groups()[0]
return unichr(int(i, 16))
str = "порно"
p = re.compile(r"&#x([0-9A-F]+);")
result = p.sub(unic, str)
print result
Офлайн
857
>>> import re >>> >>> s = "порно" >>> >>> lst = re.findall(r'[0-9a-f]+', s, re.I) >>> us = u''.join(unichr(int(i, 16)) for i in lst) >>> us u'\u043f\u043e\u0440\u043d\u043e' >>>
Офлайн
0
тоже вариант, py.user.next спасибо!
Офлайн
857
короче, твой вариант лучше, потому что он может заменять несплошные последовательности ссылок
>>> import re >>> >>> s = "abcпоdefрabcноdef" >>> >>> us = re.sub(ur'&#x([0-9a-fA-F]+);', ... lambda mo: unichr(int(mo.group(1), 16)), ... unicode(s)) >>> us u'abc\u043f\u043edef\u0440abc\u043d\u043edef' >>>
>>> import re >>> >>> s = "abcпоdefрabcноdef" >>> >>> us = re.sub(r'&#x([0-9a-fA-F]+);', ... lambda mo: unichr(int(mo.group(1), 16)), ... s) >>> us u'abc\u043f\u043edef\u0440abc\u043d\u043edef' >>>
Отредактировано py.user.next (Дек. 26, 2012 04:52:51)
Офлайн
0
так тоже работает, но непонятно, почему преобразуется к юникодовой строке (наверное, из-за юникодового значения у функции)Может потому что в третьем питоне все строки юникодные
Офлайн
857
>>> import re >>> >>> re.sub(u'.', 'r', u's') u'r' >>>
>>> import re >>> >>> re.sub('.', b'r', 's') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.3/re.py", line 170, in sub return _compile(pattern, flags).sub(repl, string, count) TypeError: sequence item 0: expected str instance, bytes found >>>
>>> import re >>> >>> re.sub(b'.', b'r', b's') b'r' >>>
>>> import re >>> >>> re.sub('.', 'r', 's') 'r' >>>
Офлайн