Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python将字符串解包到数组中_Python_Arrays_String - Fatal编程技术网

Python将字符串解包到数组中

Python将字符串解包到数组中,python,arrays,string,Python,Arrays,String,我每天都在使用Ruby,但是我在Python中遇到了一个问题。我发现这种语言非常相似。。。但是我在从Ruby迁移时遇到了一些问题:) 请帮助我在python中转换此操作: string = "qwerty2012" (var, some_var, another_var) = string.unpack("a1a4a*") 这将从字符串返回三个未打包值的变量: var = "q" # a1 some_var = "wert" # a

我每天都在使用Ruby,但是我在Python中遇到了一个问题。我发现这种语言非常相似。。。但是我在从Ruby迁移时遇到了一些问题:)

请帮助我在python中转换此操作:

   string = "qwerty2012"
   (var, some_var, another_var)  = string.unpack("a1a4a*")
这将从字符串返回三个未打包值的变量:

   var         = "q"      # a1
   some_var    = "wert"   # a4
   another_var = "y2012"  # a*
请帮助我用Python表示它 谢谢大家!

s = "qwerty2012"
(a, b, c) = s[:1], s[1:5], s[5:]
将分别完成任务和收益:

q
wert
y2012

上述赋值使用的切片表示法如所述。这篇文章也给出了很好的解释。

Python确实有一个类似的模块,名为。它缺乏以同样的方式抓取字符串其余部分的能力。不过,你几乎可以到达那里:

>>> import struct
>>> s = 'qwerty2012'
>>> struct.unpack_from('1s4s', s)
('q', 'wert')
>>> def my_unpack(format, packed_string):
...    result = []
...    result.extend(struct.unpack_from(format, packed_string))
...    chars_gobbled = struct.calcsize(format)
...    rest = packed_string[chars_gobbled:]
...    if rest:
...        result.append(rest)
...    return result
...
>>> my_unpack('1s4s', 'qwerty2012')
['q', 'wert', 'y2012']
>>> my_unpack('1s4s', 'qwert')
['q', 'wert']
>>> [hex(x) for x in my_unpack('<I', '\xDE\xAD\xBE\xEF')]
['0xefbeadde']
导入结构 >>>s='qwerty2012' >>>结构从('1s4s',s)解包 (‘q’、‘wert’) >>>def my_解包(格式、打包字符串): ... 结果=[] ... 扩展(结构解包自(格式,压缩字符串)) ... chars\u gobbled=struct.calcsize(格式) ... rest=压缩字符串[字符:] ... 如果休息: ... result.append(rest) ... 返回结果 ... >>>my_解包('1s4s','qwerty2012') ['q'、'wert'、'y2012'] >>>我的_解包('1s4s','qwert') ['q','wert']
>>>[十六进制(x)表示我的解包中的x('这里是对
解包的一个初步重新创建

import re
import StringIO

def unpack(s, fmt):
    fs = StringIO.StringIO(s)
    res = []
    for do,num in unpack.pattern.findall(fmt):
        if num == '*':
            num = len(s)
        elif num == '':
            num = 1
        else:
            num = int(num)
        this = unpack.types[do](num, fs)
        if this is not None:
            res.append(this)
    return res

unpack.types = {
    '@': lambda n,s: s.seek(n),             # skip to offset
    'a': lambda n,s: s.read(n),             # string
    'A': lambda n,s: s.read(n).rstrip(),    # string, right-trimmed
    'b': lambda n,s: bin(reduce(lambda x,y:256*x+ord(y), s.read(n), 0))[2:].zfill(8*n)[::-1],   # binary, LSB first
    'B': lambda n,s: bin(reduce(lambda x,y:256*x+ord(y), s.read(n), 0))[2:].zfill(8*n)          # binary, MSB first
}
unpack.pattern = re.compile(r'([a-zA-Z@](?:_|!|<|>|!<|!>|0|))(\d+|\*|)')

但是有一长串数据类型尚未实现(请参阅)。

这可能会简化从Ruby的迁移:

import re
import struct

def unpack(format, a_string):
    pattern = r'''a(\*|\d+)\s*'''
    widths = [int(w) if w is not '*' else 0 for w in re.findall(pattern, format)]
    if not widths[-1]: widths[-1] = len(a_string) - sum(widths)
    fmt = ''.join('%ds' % f for f in widths)
    return struct.unpack_from(fmt, a_string)

(var, some_var, another_var) = unpack('a1a4a*', 'qwerty2012')  # also 'a1 a4 a*' OK
print (var, some_var, another_var)
输出:

('q','wert','y2012')

您可能不想命名变量
string
实际上,
string
很好。Python中的类型是
str
@ChinmayKanchi,是的,但是还有string模块,我们不知道OP是否正在导入它,所以将
string
分配给新的东西会将其从名称空间中移除。这是一种糟糕的做法冰。@Chinmay但是仍然有
string
软件包-但是是的,它可能不是特别有问题。出于某种原因,我认为这个模块被称为
strings
。我想这说明了我使用它的频率。是的,把它命名为标准模块不是一个好主意。Levon,抱歉。你e是第一个!谢谢!
unpack("qwerty2012", "a1a4a*")  # -> ['q', 'wert', 'y2012']
import re
import struct

def unpack(format, a_string):
    pattern = r'''a(\*|\d+)\s*'''
    widths = [int(w) if w is not '*' else 0 for w in re.findall(pattern, format)]
    if not widths[-1]: widths[-1] = len(a_string) - sum(widths)
    fmt = ''.join('%ds' % f for f in widths)
    return struct.unpack_from(fmt, a_string)

(var, some_var, another_var) = unpack('a1a4a*', 'qwerty2012')  # also 'a1 a4 a*' OK
print (var, some_var, another_var)