你的字符串中没有反斜杠。你没有的东西,就无法删除。
考虑一下你所展示的 '\x82' ... 这是一个单字节字符串。
>>> s = '\x82'
>>> len(s)
1
>>> ord(s)
130
>>> hex(ord(s))
'0x82'
>>> print s
é
>>> print repr(s)
'\x82'
>>>
你“宁愿获得”的('x82')是没有意义的。
更新:字符串的“非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 Translate将“Can not you see the future”翻译为英语。
在另一个答案的评论中,您说:
“我只需要ascii”
和
“What I'm doing with it is seeing how far apart the two strings are using nltk.edit_distance(), so this will give me a multiple of the true distance. Which is good enough for me.”
你为什么认为你需要ASCII? 编辑距离完全独立于任何字母表。
首先,对您的字符串进行无意义的转换不会给您真实距离的一致或可预测的倍数。 其次,在以下内容中:
x
repr(x)
repr(x).replace('\\', '')
repr(x).replace('\\x', '')
x.decode(whatever_the_encoding_is)
为什么你选择第三个选项?
更新2,回应评论:
(1)你还没有说为什么认为需要“ascii”。
nltk.edit_distance不需要“ascii”——参数被称为“字符串”(不管这意味着什么),但是代码将适用于任何两个对象序列,其中
!=
有效。换句话说,为什么不只使用上述5个选项中的第一个?
(2)接受高达100%的编辑距离膨胀有些惊人。请注意,您当前选择的方法将每个日语字符使用4个符号(十六进制数字)。
repr(x)
每个字符使用8个符号。
x
(第一个选项)使用2个符号。
(3) 你可以通过对编辑距离进行标准化来缓解通货膨胀的影响。与将
distance(s1, s2)
与一个符号数量阈值进行比较不同,将
distance(s1, s2) / float(max(len(s1), len(s2)))
与一个分数阈值进行比较。请注意,通常情况下会使用标准化...理由是具有编辑距离为4的20个符号字符串之间的差异与具有编辑距离为2的10个符号字符串之间的差异大致相同,而不是两倍。
(4) nltk.edit_distance是我见过的最令人震惊的纯Python实现的编辑距离,
Magnus Lie Hetland的这个实现要好得多,但仍有改进的空间。