从序列超出范围的字符串中删除所有字符

时间:2012-06-06 22:44:23

标签: python regex ascii hashlib ordinal

从python中的字符串中删除范围之外的所有字符:ordinal(128)有什么好方法?

我在python 2.7中使用hashlib.sha256。我得到了例外:

  

UnicodeEncodeError:'ascii'编解码器无法对位置13中的字符u'\ u200e'进行编码:序数不在范围内(128)

我认为这意味着一些时髦的角色进入了我想要散列的字符串。

谢谢!

3 个答案:

答案 0 :(得分:5)

new_safe_str = some_string.encode('ascii','ignore') 

我认为会起作用

或者你可以做一个列表理解

"".join([ch for ch in orig_string if ord(ch)<= 128])

[编辑]然而,正如其他人所说,最好弄清楚如何处理unicode ...除非你真的需要它因为某种原因编码为ascii

答案 1 :(得分:4)

最好不要删除那些字符,最好使用hashlib不会阻塞的编码,例如:utf-8:

>>> data = u'\u200e'
>>> hashlib.sha256(data.encode('utf-8')).hexdigest()
'e76d0bc0e98b2ad56c38eebda51da277a591043c9bc3f5c5e42cd167abc7393e'

答案 2 :(得分:2)

这是python3中的更改将进行改进的示例,或者至少生成更清晰的错误消息

Python2

>>> import hashlib
>>> funky_string=u"You owe me £100"
>>> hashlib.sha256(funky_string)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 11: ordinal not in range(128)
>>> hashlib.sha256(funky_string.encode("utf-8")).hexdigest()
'81ebd729153b49aea50f4f510972441b350a802fea19d67da4792b025ab6e68e'
>>> 

Python3

>>> import hashlib
>>> funky_string="You owe me £100"
>>> hashlib.sha256(funky_string)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Unicode-objects must be encoded before hashing
>>> hashlib.sha256(funky_string.encode("utf-8")).hexdigest()
'81ebd729153b49aea50f4f510972441b350a802fea19d67da4792b025ab6e68e'
>>> 

真正的问题是sha256采用了一系列字节,而python2没有明确的概念。使用.encode("utf-8")就是我的建议。