Как удалить \ из строки в Python - PullRequest
3 голосов
/ 24 апреля 2011

У меня проблемы с получением функции replace ()

Я пробовал my_string.replace('\\', '') и re.sub('\\', '', my_string), но ни один из них не работает.

Я думал, что \ было спасениекод для обратной косой черты, я не прав?

Рассматриваемая строка выглядит как

'<2011315123.04C6DACE618A7C2763810@\x82\xb1\x82\xea\x82\xa9\x82\xe7\x8c\xa9\x82\xa6\x82\xe9\x82\xbe\x82\xeb\x82\xa4>'

или print my_string <2011315123.04C6DACE618A7C2763810@???ꂩ?猩???邾?낤>

Да,это должно выглядеть как мусор, но я бы предпочел '<2011315123.04C6DACE618A7C2763810@82b182ea82a982e78ca982a682e982be82eb82a4>'

Ответы [ 2 ]

8 голосов
/ 24 апреля 2011

У вас нет обратной косой черты в вашей строке.То, чего у вас нет, вы не можете удалить.

Считайте, что вы показываете как '\x82' ... это однобайтовая строка.

>>> s = '\x82'
>>> len(s)
1
>>> ord(s)
130
>>> hex(ord(s))
'0x82'
>>> print s
é # my sys.stdout.encoding is 'cp850'
>>> print repr(s)
'\x82'
>>>

Что вы'd' get get '('x82') не имеет смысла.

Update Часть строки, не относящаяся к ascii (ограниченная @ и >) на самом делеЯпонский текст написан в основном на хирагане и закодирован с использованием shift_jis.Стенограмма сеанса IDLE:

>>> y = '\x82\xb1\x82\xea\x82\xa9\x82\xe7\x8c\xa9\x82\xa6\x82\xe9\x82\xbe\x82\xeb\x82\xa4'
>>> print y.decode('shift_jis')
これから見えるだろう

Переводчик Google выдает "Неужели ты не видишь будущее" как перевод на английский язык.

В комментарии к другому ответу ты говоришь:

Мне просто нужны ascii

и

Что я делаю с этим, так это вижу, как далеко друг от друга две строки используют nltk.edit_distance (), так что это даст мне кратное истинного расстояния.Что для меня достаточно.

Почему вы думаете, что вам нужен ASCII?Расстояние редактирования определяется совершенно независимо от алфавита.

Для начала, бессмысленные преобразования ваших строк не дадут вам последовательных или предсказуемых кратныхистинное расстояние.Во-вторых, из следующего:

x
repr(x)
repr(x).replace('\\', '')
repr(x).replace('\\x', '') # if \ is noise, so is x
x.decode(whatever_the_encoding_is)

почему вы выбираете третий?

Обновление 2 в ответ на комментарии:

(1Вы до сих пор не сказали, почему вы думаете, что вам нужно "ASCII". nltk.edit_distance не требует "ascii" - аргументы называются "строками" (что бы это ни значило), но код будет работать с любыми 2 последовательностями объектов, для которых != работает.Другими словами, почему бы просто не использовать первый из указанных выше 5 вариантов?

(2) Принятие до 100% инфляции расстояния редактирования несколько удивительно.Обратите внимание, что выбранный вами метод будет использовать 4 символа (шестнадцатеричные цифры) на каждый японский символ.repr(x) использует 8 символов на символ.x (первый вариант) использует 2.

(3) Вы можете смягчить эффект инфляции, нормализуя расстояние редактирования.Вместо сравнения distance(s1, s2) с порогом number_of_symbols, сравните distance(s1, s2) / float(max(len(s1), len(s2))) с порогом дроби.Заметим, что нормализация обычно используется в любом случае ... обоснование состоит в том, что различие между строками из 20 символов с расстоянием редактирования 4 примерно такое же, как между строками из 10 символов с расстоянием редактирования 2, а не вдвое больше.

(4) nltk.edit_distance - самая шокирующе неэффективная реализация edit_distance на чистом Python, которую я когда-либо видел. Эта реализация Магнуса Ли Хетланда намного лучше, но все же способна к улучшению.

2 голосов
/ 24 апреля 2011

Это работает, я думаю, если вы действительно хотите просто убрать "\"

>>> a = '<2011315123.04C6DACE618A7C2763810@\x82\xb1\x82\xea\x82\xa9\x82\xe7\x8c\xa9\x82\xa6\x82\xe9\x82\xbe\x82\xeb\x82\xa4>'
>>> repr(a).replace("\\","")[1:-1]
'<2011315123.04C6DACE618A7C2763810@x82xb1x82xeax82xa9x82xe7x8cxa9x82xa6x82xe9x82xbex82xebx82xa4>'
>>> 

Но, как и ответ выше, то, что вы получите, в значительной степени бессмысленно.

...