2015-07-29 6 views
0

У меня есть файл со следующими двумя строками:Как сравнить эти две строки в Python?

25_%D1%80%D0%B0%D1%88%D3%99%D0%B0%D1%80%D0%B0 
25_\xD1\x80\xD0\xB0\xD1\x88\xD3\x99\xD0\xB0\xD1\x80\xD0\xB0 

Они оба представляют один и тот же URL-путь, и, следовательно, должны быть равны. Я хотел бы применить одну и ту же «функцию очистки» к обоим, получив одну и ту же строку.

После прочтения этих строк из файла У меня есть:

>> s0 
'25_%D1%80%D0%B0%D1%88%D3%99%D0%B0%D1%80%D0%B0' 
>> s1 
'2_\\xD1\\x80\\xD0\\xB0\\xD1\\x88\\xD3\\x99\\xD0\\xB0\\xD1\\x80\\xD0\\xB0' 

(обратите внимание, сбежавший слеш s1). Если я s0 конец цитаты я получаю следующее:

>> import urllib 
>> t0 = urllib.unquote(s0) 
'25_\xd1\x80\xd0\xb0\xd1\x88\xd3\x99\xd0\xb0\xd1\x80\xd0\xb0' 
>> print t0 
25_рашәара 

, который хорошо. Однако, единственное, что я знаю, чтобы сделать на s1 заключается в следующем:

>> t1 = s1.decode("unicode_escape") 
u'2_\xd1\x80\xd0\xb0\xd1\x88\xd3\x99\xd0\xb0\xd1\x80\xd0\xb0' 
>> print t1 
2_ÑаÑÓÐ°Ñ 

который выглядит сломана. Мой вопрос: какая функция clean(s) может быть записана для нормализации этих двух строк, так что они либо являются <type 'str'>, либо оба - <type 'unicode'>, и оба печатают одинаково (и сравнивают одинаково также)?

ответ

2

Рассмотрим:

>>> s0 = '25_%D1%80%D0%B0%D1%88%D3%99%D0%B0%D1%80%D0%B0' 
>>> s1 = '25_\\xD1\\x80\\xD0\\xB0\\xD1\\x88\\xD3\\x99\\xD0\\xB0\\xD1\\x80\\xD0\\xB0' 
>>> import urllib 
>>> t0 = urllib.unquote(s0).decode('utf8') 
>>> t1 = s1.decode('string_escape').decode('utf8') 
>>> print t0 
25_рашәара 
>>> print t1 
25_рашәара 
>>> t0 == t1 
True 
>>> 
+0

Это работает! Я действительно пробовал 's1.decode ('unicode_escape')', который не работал. Не могли бы вы дать мне быстрый указатель относительно разницы между 'string_escape' и' unicode_escape'? – gdiazc

+0

@Gonzalo: string_escape для строк, unicode_escape для юникодов;) – georg

Смежные вопросы