您的字符串中没有任何反斜杠。你没有的,你不能删除。
考虑一下您显示的内容'\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'
>>>
你“宁愿得到”的东西 ( 'x82'
) 是没有意义的。
更新字符串的“非ascii”部分(以@
and为界>
)实际上是日语文本,主要用平假名编写并使用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')
これから見えるだろう
谷歌翻译产生“Can not you see the future”作为英文翻译。
在对另一个答案的评论中,您说:
我只需要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”——args 被称为“字符串”(无论这意味着什么),但代码将适用于任何 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)))
与分数阈值进行比较。无论如何,通常都会使用归一化......其基本原理是编辑距离为 4 的 20 个符号字符串之间的差异与编辑距离为 2 的 10 个符号字符串之间的差异大致相同,而不是两倍。
(4) nltk.edit_distance 是我见过的最令人震惊的低效纯 Python 实现的 edit_distance。Magnus Lie Hetland 的这个实现要好得多,但仍然可以改进。