简体   繁体   English

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

[英]Python - Split a string into list after a certain number of special characters

I have a python program which does a SOAP request to a server, and it works fine: 我有一个对服务器执行SOAP请求的python程序,它工作正常:
I get the answer from the server, parse it, clean it, and when I am done, I end up with a string like that: 我从服务器得到答案,对其进行解析,清理,完成后,我得到的字符串如下:

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|...

Basically, it is a string with values delimited by "|". 基本上,它是一个字符串,其值以“ |”分隔。 I also know the structure of the database I am requesting, so I know that it has 6 columns and various rows. 我也知道我要的数据库结构,所以我知道它有6列和各种行。 I basically need to split the string after every 6th "|" 我基本上需要在每6个“ |”之后分割字符串 character, to obtain something like: 字符,以获得类似的内容:

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|...

Can you tell me how to do that in Python? 您能告诉我如何在Python中执行此操作吗? Thank you! 谢谢!

Here's a functional-style solution. 这是一种功能样式的解决方案。

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 + '|')

output 输出

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 info on how zip(*[iter(seq)] * rowsize) works, please see the links at Splitting a list into even chunks . 有关zip(*[iter(seq)] * rowsize)工作方式的信息,请参见“将列表分成偶数块”中的链接。

How about this: 这个怎么样:

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
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|']

Here is a flexible generator approach: 这是一种灵活的生成器方法:

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)

Output: 输出:

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

There are really many ways to do it. 确实有很多方法可以做到。 Even with a loop: 即使有循环:

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

The print is just to saw the results, you remove it: 打印只是为了查看结果,您将其删除:

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|

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM