Jos*_*son 3 python string replace backslash
我无法让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>'
您的字符串中没有任何反斜杠.你没有什么,你不能删除.
考虑一下你所展示的'\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')的意义毫无意义.
更新字符串的"non-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')
??????????
谷歌翻译产生"你不能看到未来"作为英文翻译.
在对另一个答案的评论中,你说:
我只需要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是我见过的最令人震惊的低效的edit -distance纯Python实现.Magnus Lie Hetland的这个实现要好得多,但仍然能够改进.