Найти - Пользователи
Полная версия: упаковать в юникод
Начало » Python для новичков » упаковать в юникод
1
lobster
Всех приветствую!
Подскажите, как упаковать число в юникод, вот нашел код но он на перле:
$str =~ s/&#x([0-9A-F]+?);/pack("U", hex($1))/ge;
Пробовал крутить этот struct.pack и так и сяк, никак не выходит преобразовать к виду u'\u….'. А вообще мне нужно избавиться от эскейп символов(х).
py.user.next
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'
>>>
для второго (может, получше что есть)
lobster
py.user.next
второй пример работает, только не понятно откуда ты взял 0xd0b0 если кириллическая “a” в юникодном представлении \u0430
lobster
А вот, все, дошло сделал при помощи 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
py.user.next
>>> 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'
>>>
lobster
тоже вариант, py.user.next спасибо!
py.user.next
короче, твой вариант лучше, потому что он может заменять несплошные последовательности ссылок

>>> 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'
>>>
так тоже работает, но непонятно, почему преобразуется к юникодовой строке (наверное, из-за юникодового значения у функции)
lobster
так тоже работает, но непонятно, почему преобразуется к юникодовой строке (наверное, из-за юникодового значения у функции)
Может потому что в третьем питоне все строки юникодные
py.user.next
>>> 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'
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB