Python - 在一定数量的特殊字符后将字符串拆分为列表

时间:2017-01-27 12:26:32

标签: python

我有一个python程序向服务器发出SOAP请求,它工作正常:
我从服务器得到答案,解析它,清理它,当我完成后,我最终得到一个这样的字符串:

name|value|value_name|default|seq|last_modify|record_type|1|Detail|0|0|20150807115904|zero_out|0|No|0|0|20150807115911|out_ind|1|Partially ZeroOut|0|0|20150807115911|...

基本上,它是一个字符串,其值由“|”分隔。我也知道我请求的数据库的结构,所以我知道它有6列和各行。我基本上需要在每隔6个“|”之后拆分字符串角色,获得类似的东西:

name|value|value_name|default|seq|last_modify|

record_type|1|Detail|0|0|20150807115904|

zero_out|0|No|0|0|20150807115911|

out_ind|1|Partially ZeroOut|0|0|20150807115911|...

你能告诉我如何用Python做到这一点吗?谢谢!

5 个答案:

答案 0 :(得分:2)

这是一种功能性的解决方案。

s = 'name|value|value_name|default|seq|last_modify|record_type|1|Detail|0|0|20150807115904|zero_out|0|No|0|0|20150807115911|out_ind|1|Partially ZeroOut|0|0|20150807115911|'

for row in map('|'.join, zip(*[iter(s.split('|'))] * 6)):
    print(row + '|')

<强>输出

name|value|value_name|default|seq|last_modify|
record_type|1|Detail|0|0|20150807115904|
zero_out|0|No|0|0|20150807115911|
out_ind|1|Partially ZeroOut|0|0|20150807115911|

有关zip(*[iter(seq)] * rowsize)工作原理的信息,请参阅Splitting a list into even chunks上的链接。

答案 1 :(得分:1)

这个怎么样:

a = 'name|value|value_name|default|seq|last_modify|record_type|1|Detail|0|0|20150807115904|zero_out|0|No|0|0|20150807115911|out_ind|1|Partially ZeroOut|0|0|20150807115911|'
b = a.split('|')
c = [b[6*i:6*(i+1)] for i in range(len(b)//6)]  # this is a very workable form of data storage
print('\n'.join('|'.join(i) for i in c))  # produces your desired output

# prints:
#  name|value|value_name|default|seq|last_modify
#  record_type|1|Detail|0|0|20150807115904
#  zero_out|0|No|0|0|20150807115911
#  out_ind|1|Partially ZeroOut|0|0|20150807115911

答案 2 :(得分:1)

data = "name|value|value_name|default|seq|last_modify|record_type|1|Detail|0|0|20150807115904|zero_out|0|No|0|0|20150807115911|out_ind|1|Partially ZeroOut|0|0|20150807115911|"
splits = data.split('|')
splits = list(filter(None, splits))  # Filter empty strings
row_len = 6
rows = ['|'.join(splits[i:i + row_len]) + '|' for i in range(0, len(splits), row_len)]
print(rows)
>>> ['name|value|value_name|default|seq|last_modify|', 'record_type|1|Detail|0|0|20150807115904|', 'zero_out|0|No|0|0|20150807115911|', 'out_ind|1|Partially ZeroOut|0|0|20150807115911|']

答案 3 :(得分:1)

这是一种灵活的发电机方法:

def splitOnNth(s,d,n, keep = False):
    i = s.find(d)
    j = 1
    while True:
        while i > 0 and j%n != 0:
            i = s.find(d,i+1)
            j += 1
        if i < 0:
            yield s
            return #end generator
        else:
            yield s[:i+1] if keep else s[:i]
            s = s[i+1:]
            i = s.find(d)
            j = 1

#test runs, showing `keep` in action:

test = 'name|value|value_name|default|seq|last_modify|record_type|1|Detail|0|0|20150807115904|zero_out|0|No|0|0|20150807115911|out_ind|1|Partially ZeroOut|0|0|20150807115911|'
for s in splitOnNth(test,'|',6,True): print(s)
print('')
for s in splitOnNth(test,'|',6): print(s)

输出:

name|value|value_name|default|seq|last_modify|
record_type|1|Detail|0|0|20150807115904|
zero_out|0|No|0|0|20150807115911|
out_ind|1|Partially ZeroOut|0|0|20150807115911|

name|value|value_name|default|seq|last_modify
record_type|1|Detail|0|0|20150807115904
zero_out|0|No|0|0|20150807115911
out_ind|1|Partially ZeroOut|0|0|20150807115911

答案 4 :(得分:0)

有很多方法可以做到这一点。即使有一个循环:

a = 'name|value|value_name|default|seq|last_modify|record_type|1|Detail|0|0|20150807115904' \
    '|zero_out|0|No|0|0|20150807115911|out_ind|1|Partially ZeroOut|0|0|20150807115911|'

new_a = []
ind_start, ind_end = 0, 0
for i in range(a.count('|')// 6):
    for i in range(6):
        ind_end = a.index('|', ind_end+1)
    print(a[ind_start:ind_end + 1])
    new_a.append(a[ind_start:ind_end+1])
    ind_start = ind_end+1

打印只是为了看到结果,你将其删除:

name|value|value_name|default|seq|last_modify|
record_type|1|Detail|0|0|20150807115904|
zero_out|0|No|0|0|20150807115911|
out_ind|1|Partially ZeroOut|0|0|20150807115911|