我有一个这样的字符串:
un: 'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'
pw: 'BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$ \x00!\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08'
这是我的代码:
un = re.search(r"un: '(.+)'",page).group(1)
bz2.decompress(un)
然后我使用bz2.decompress
方法,它返回错误:
IOError: invalid data stream
我试试这个:
un = 'BZh91...\x084'
bz2.decompress(un)
并返回正确答案。
补充:这是我的完整代码。
#!/usr/bin/env python
import urllib
import re
import bz2
def main():
page=urllib.urlopen("http://www.pythonchallenge.com/pc/def/integrity.html").read()
unstring = re.search(r"un: *'(.+)'",page).group(1)
print unstring
un = "BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084"
#the string un is copied from output of 'print unstring'
print bz2.decompress (un)
print bz2.decompress (unstring)
if (__name__=="__main__"):
main()
这是输出:
==== No Subprocess ====
>>>
BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084
huge
Traceback (most recent call last):
File "/home/terry/pythonchallage/pythonchallenge_8.py", line 16, in <module>
main()
File "/home/terry/pythonchallage/pythonchallenge_8.py", line 14, in main
print bz2.decompress (unstring)
IOError: invalid data stream
>>>
答案 0 :(得分:1)
你有字符串文字,其中每个\xhh
值是4个字面字符,而不是字节转义。
如果是这样,您首先需要告诉Python解释这些:
bz2.decompress(un.decode('string_escape'))
演示:
>>> unstring = r'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'
>>> print unstring
BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084
>>> unstring
'BZh91AY&SYA\\xaf\\x82\\r\\x00\\x00\\x01\\x01\\x80\\x02\\xc0\\x02\\x00 \\x00!\\x9ah3M\\x07<]\\xc9\\x14\\xe1BA\\x06\\xbe\\x084'
>>> import bz2
>>> bz2.decompress(unstring)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: invalid data stream
>>> bz2.decompress(unstring.decode('string_escape'))
'huge'
答案 1 :(得分:1)
正如Martijn指出的那样,数据实际上是无效的,所以它不会解压缩。
除此之外,假设您的问题中没有拼写错误,另一个潜在的问题是:您的正则表达式模式期望在un:
之后有一个空格,但您的示例字符串中没有这样的空格。您可以将正则表达式更改为r"un: *'(.+)'"
,这样可以在:
和'
之间留出零个或多个空格。