【问题标题】:Unicode strings to byte strings without the addition of backslashesUnicode 字符串到字节字符串,不添加反斜杠
【发布时间】:2013-12-23 02:32:59
【问题描述】:

我正在通过使用 python3.3 进行 python 挑战来学习 python,我在 question eight。标记中有一条注释,为您提供两个 bz2 压缩的 unicode 字符串输出字节字符串,一个用于用户名,一个用于密码。还有一个链接,您需要在其中输入解压缩的凭据。 轻松解决此问题的一种方法是手动复制字符串并将其作为字节字符串分配给两个变量,然后使用 bz2 库对其进行解压缩:

>>>un=b'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'
>>>print(bz2.decompress(un).decode('utf-8'))
huge

但这不适合我,因为我想通过运行我的 python 文件来获得答案。 我的代码是这样的:

>>>import bz2, re, requests

>>>url = requests.get('http://www.pythonchallenge.com/pc/def/integrity.html')
>>>un = re.findall(r'un: \'(.*)\'',url.text)[0]
>>>correct=b'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'
>>>print(un,un is correct,sep='\n')
b'BZh91AY&SYA\\xaf\\x82\\r\\x00\\x00\\x01\\x01\\x80\\x02\\xc0\\x02\\x00 \\x00!\\x9ah3M\\x07<]\\xc9\\x14\\xe1BA\\x06\\xbe\\x084'
False

问题在于,当它从 unicode 字符串转换为字节字符串时,会添加转义的反斜杠,因此 bz2 模块无法读取它。我已经尝试了我所知道的所有内容以及搜索时发现的内容。

如何将其从 unicode 转换为 byte 以使其不会被更改?

【问题讨论】:

  • 我仍在测试这是否是您的实际错误,但is 不是正确的运算符,无法查看您是否正确检索了内容。 is 测试对象相等,而不是语义相等。
  • 感谢您的宝贵时间,您有什么想法吗?似乎无法删除或替换其中一个斜杠,而且我不知道如何在不转换的情况下将 unicode 字符串分配为字节字符串。感谢您对is 声明的评论。

标签: python string byte python-3.3


【解决方案1】:

反斜杠出现在 HTML 源代码中,因此 requests 模块保留它们也就不足为奇了。我的 Python 3 环境中没有安装 requests,所以我无法完全复制您的情况,但在我看来,如果您开始捕获周围的 ' 字符,您可以使用 @987654324 @将字符序列解析为字节数组:

>>> test
"'BZh91AY&SYA\\xaf\\x82\\r\\x00\\x00\\x01\\x01\\x80\\x02\\xc0\\x02\\x00 \\x00!\\x9ah3M\\x07<]\\xc9\\x14\\xe1BA\\x06\\xbe\\x084'"
>>> import ast
>>> res = ast.literal_eval("b%s" % test)
>>> import bz2
>>> len(bz2.decompress(res))
4

可能还有其他方法,但为什么不使用 Python 内置的知识,即字节序列 b'\\xaf' 可以解析为字节数组?

【讨论】:

  • requestsurllib.request 库的使用具有相同的结果,所以问题是,如何从字符串中删除转义反斜杠。你回答了这个问题,正如我所希望的那样!这是一个非常方便的工具,ast.literal_eval(),直到现在我还没有偶然发现它。谢谢!我想我知道该输入是如何工作的,但我还不确定为什么我需要在我的字符串周围额外添加',你介意启发我吗?再次感谢! (我不能投票,因为我是新人)
  • 这有点复杂——我必须自己完成几个版本才能让它工作。基本上,literal_eval 的参数必须是可以在 Python 提示符中键入或放入源代码的内容。但是您仍然必须使其在源本身中有意义,因此您需要(松散地说)额外的文字编码层。您需要给 literal_eval 一个字符串对象,它本身代表一个字符串对象。 "b%s" % test 的计算结果为 "b'BZh...'",它本身就是一个表示字节数组 b'BZh...' 的文字。
【解决方案2】:

这里是solution:

import urllib
import bz2
import re

def decode(line):
   out = re.search(r"\'(.*?)\'",''.join(line)).group()
   out = eval("b%s" % out)
   return bz2.decompress(out)

#read lines that contain the encoded message
page = urllib.urlopen('http://www.pythonchallenge.com/pc/def/integrity.html').readlines()[20:22]

print "Click on the bee and insert: "
User_Name = decode(page[0])
print "User Name is: " + User_Name
Password = decode(page[1])
print "Password is: " + Password

【讨论】:

    猜你喜欢
    • 2013-05-29
    • 1970-01-01
    • 2017-02-28
    • 2011-08-01
    • 2017-06-13
    • 2021-03-28
    • 2022-01-23
    • 2011-01-08
    相关资源
    最近更新 更多