Python 将字符串拆分为列表,然后将列表拆分为列表列表

Python 将字符串拆分为列表,然后将列表拆分为列表列表,python,list,split,Python,List,Split,我有一个字符串,它的一个示例如下所示: 有一些模式,通常在“序列”之后:接下来的22个元素重复,这些是我想要隔离的数据 因此,我在想,如果我将序列:处的字符串拆分为一个元素列表,然后通过\n将生成的列表拆分为一个列表,那么每个长度为22个元素的列表都将是我想要的数据。因此,我尝试了以下代码: proc = subprocess.Popen(cmd_rancli, stdin=subprocess.PIPE, stdout=subprocess.PIPE) //proc_stdo

我有一个字符串,它的一个示例如下所示:

有一些模式,通常在“序列”之后:接下来的22个元素重复,这些是我想要隔离的数据

因此,我在想,如果我将
序列:
处的字符串拆分为一个元素列表,然后通过
\n
将生成的列表拆分为一个列表,那么每个长度为22个元素的列表都将是我想要的数据。因此,我尝试了以下代码:

    proc = subprocess.Popen(cmd_rancli, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
    //proc_stdout is the string
    proc_stdout  = proc.communicate(ran_opt_get_access_data)[0]

    parse = proc_stdout.split('Sequence:')
    print parse
    time.sleep(5)
    parse2 = [i.split('\n')[0] for i in parse] 
    print parse2
    time.sleep(5)
然而,第二条并没有给我我所期望的,我做错了什么

实际产量:

    parse2 = ['RAN> get ap 108352 attr=4192', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' 
', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
拆分并返回空间


下面是第一次解析的一些结果:

使用您在pastebin上提供的字符串(作为变量
a
的内容):

>>result=[i.strip().split('\n')用于a.split('Sequence')中的i]
>>>[len(i)代表结果中的i]
[10, 1, 3, 1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 3, 1, 23, 23, 23]
例如:

序列:
数值(整数):1
值(字符串):2013-02-26T15:01:11Z
顺序:
因此,让我们只过滤那些包含23个元素的元素(注意第一个元素是
):

>>如果len(i)==23,则结果中i的结果=[i[1:]
>>>[len(i)代表结果中的i]
[22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22]
现在有了一个如下所示的数组:

打印('\n'.join(结果[0])) 数值(整数):10564 数值(整数):13 数值(整数):388 值(int):0 值(整数):-321 数值(整数):83 值(字符串):272 值(字符串):05 数值(整数):67 数值(整数):67 数值(整数):708 数值(整数):896 数值(整数):31 数值(整数):128 数值(整数):-12 数值(整数):-109 值(int):0 数值(整数):-20 值(int):-111 值(int):-1 值(int):-1 值(int):0 因此,您所提供的数据所需的全部代码如下:

proc\u stdout=proc.communication(运行选择获取访问数据)[0]。解码('utf-8')
结果=[i.strip().split('\n'),用于进程中的i\u stdout.split('Sequence')]
如果len(i)==23,则结果中的i的结果=[i[1:]
#或者,如果len(i)>1,结果中的i至少为[i[1:]

编辑-删除值 我们将使用简单的hack,因此总是只有一个
和删除空白:

def filter_值(文本):
index=text.find(“:”)
#未找到:
如果指数<0:
返回text.strip()
返回文本[索引+1:][.strip()
并通过替换此行来实现:

result=[i[1:]如果len(i)==23,则结果中的i为i]
用这一行:

result=[[i中j的过滤器_值(j)[1:]如果len(i)==23,则结果中i的过滤器_值(j)]]

使用您在pastebin上提供的字符串(作为变量
a的内容)

>>result=[i.strip().split('\n')用于a.split('Sequence')中的i]
>>>[len(i)代表结果中的i]
[10, 1, 3, 1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 3, 1, 23, 23, 23]
例如:

序列:
数值(整数):1
值(字符串):2013-02-26T15:01:11Z
顺序:
因此,让我们只过滤那些包含23个元素的元素(注意第一个元素是
):

>>如果len(i)==23,则结果中i的结果=[i[1:]
>>>[len(i)代表结果中的i]
[22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22]
现在有了一个如下所示的数组:

打印('\n'.join(结果[0])) 数值(整数):10564 数值(整数):13 数值(整数):388 值(int):0 值(整数):-321 数值(整数):83 值(字符串):272 值(字符串):05 数值(整数):67 数值(整数):67 数值(整数):708 数值(整数):896 数值(整数):31 数值(整数):128 数值(整数):-12 数值(整数):-109 值(int):0 数值(整数):-20 值(int):-111 值(int):-1 值(int):-1 值(int):0 因此,您所提供的数据所需的全部代码如下:

proc\u stdout=proc.communication(运行选择获取访问数据)[0]。解码('utf-8')
结果=[i.strip().split('\n'),用于进程中的i\u stdout.split('Sequence')]
如果len(i)==23,则结果中的i的结果=[i[1:]
#或者,如果len(i)>1,结果中的i至少为[i[1:]

编辑-删除值 我们将使用简单的hack,因此总是只有一个
和删除空白:

def filter_值(文本):
index=text.find(“:”)
#未找到:
如果指数<0:
返回text.strip()
返回文本[索引+1:][.strip()
并通过替换此行来实现:

result=[i[1:]如果len(i)==23,则结果中的i为i]
用这一行:

result=[[i中j的过滤器_值(j)[1:]如果len(i)==23,则结果中i的过滤器_值(j)]]

您没有得到预期结果的原因是,每个
序列:
和下面的换行符之间都有空格
[i.split('\n')[0]for i in parse]
将在新行上拆分后获取第一项,即空白

我建议您做一些稍微复杂一点的事情,创建一个dict来模拟您的输出,而不是修复这种方法:

def add_data(key, value, data):
    if key.startswith('Value('):
        if key.endswith('(int)'):
            value = int(value)
        data['Sequences'][-1].append(value)
    elif key == 'Sequence':
        data['Sequences'].append([])
    else:
        data[key] = value

def parse_lines(lineseq):
    data = {'Sequences':[]}
    for line in lineseq:
        try:
            key, value = [part.strip() for part in line.split(':', 1)]
        except ValueError:
            continue
        add_data(key, value, data)
    return data

lines = proc_stdout.split('\n')
data = parse_lines(lines)
这将产生如下数据结构:

{'AttributeId': '4192',
 'AttributeList': '',
 'ClassId': '1014 (AP)',
 'InstanceId': '0',
 'MessageType': '81 (GetAttributesResponse)',
 'ObjectInstance': '',
 'Protocol': 'BSMIS Rx',
 'RDN': '',
 'TransactionId': '66',
 'Sequences': [[],
               [1,'2013-02-26T15:01:11Z'],
               [],
               [10564,13,388,0,-321,83,'272','05',67,67,708,896,31,128,-12,-109,0,-20,-111,-1,-1,0],
               [10564,13,108,0,-11,83,'272','05',67,67,708,1796,31,128,-12,-109,0,-20,-111,-1,-1,0],
               [10589,16,388,0,-15,79,'272','05',67,67,708,8680,31,125,-16,-110,0,-20,-111,-1,-1,0],
               [10589,15,108,0,-16,81,'272','05',67,67,708,8105,31,126,-14,-109,0,-20,-111,-1,-1,0],
               [10637,40,233,0,-11,89,'272','03',30052,1,5,54013,33,103,-6,-76,1,-20,-111,-1,-1,0],
               [10662,46,234,0,-15,85,'272','03',30052,1,5,54016,33,97,-10,-74,1,-20,-111,-1,-1,0],
               [10712,51,12,0,-24,91,'272','01',4013,254,200,2973,3,62,-4,-63,0,-20,-111,-1,-1,0],
               [10737,15,224,0,-16,82,'272','01',3020,21,21,40770,33,128,-13,-108,0,-20,-111,-1,-1,0],
               [10762,14,450,0,-7,78,'272','01',3020,21,21,53215,29,125,-17,-113,0,-20,-111,-1,-1,0],
               [10762,15,224,0,-7,85,'272','01',3020,21,21,50770,33,128,-10,-105,0,-20,-111,-1,-1,0],
               [10762,14,124,0,-7,78,'272','01',3020,10,10,56880,32,128,-17,-113,0,-20,-111,-1,-1,0],
               [10812,11,135,0,-14,81,'272','02',36002,1,11,43159,31,130,-14,-113,1,-20,-111,-1,-1,0],
               [10837,42,23,0,-9,89,'272','02',36002,1,11,53529,31,99,-6,-74,1,-20,-111,-1,-1,0,54],
               [13,'2013-02-26T15:02:09Z'],
               [],
               [2,12,7,0,9,70,'272','02',20003,0,0,15535,0,0,0,0,1,100,100,-1,-1,0],
               [5,15,44,0,-205,77,'272','02',20003,0,0,15632,0,0,0,0,1,100,100,-1,-1,0],
               [7,25,9,0,0,84,'272','02',20002,0,0,50883,0,0,0,0,1,100,100,-1,-1,0]]
}
如果您只需要长度为22的序列,则很容易得到:

len22seqs = [s for s in data['Sequences'] if len(s)==22]
# alternatively:
len22seqs = filter(lambda s: len(s)==22, data['Sequences'])

您没有得到预期结果的原因是,每个
序列:
和下面的换行符之间都有空格
[i.split('\n')[0]for i in parse]
将在新行上拆分后获取第一项,即空白

我建议,不要修正这种方法