如何拆分 Python 中的嵌套字符串?
How to split nested string in Python?
我有一些有限结构的动态字符串,使用基本的 .split() 命令无法按预期拆分。有哪些方法可以达到预期效果?
示例字符串:
"array<struct<orderlineid:string,ordernumber:string,price:struct<currencycode:string,value:double>,quantity:int,serialnumbers:array<string>,sku:string>>"
拆分目标:
['orderlineid:string', 'ordernumber:string', 'price:struct<currencycode:string,value:double>','quantity:int','serialnumbers:array<string>', 'sku:string']
重要通知:有人建议去掉字符串的开头和结尾并使用逗号,这对这个问题不起作用,因为请看嵌套结构还包括逗号,我们不想在其中拆分。
规则:
第一个结构总是在开头的“array”之后。第二个结构可能是也可能不是。如果没有第二个结构(我称之为嵌套结构)解决方案很容易在摆脱非字母数字字符后在逗号上使用拆分函数。但是当我有嵌套结构时,该结构内部也有逗号,我想将其作为一个整体而不拆分。
这看起来像是嵌套结构编码。您似乎想要第二层嵌入的子结构的内容。因此,您可以计算每个字符位置的嵌套级别,排除级别 0 和 1,并在级别 2 的逗号上拆分。由于还有其他逗号,首先用另一个字符替换可拆分逗号将允许您使用常规拆分提取:
S = "array<struct<orderlineid:string,ordernumber:string,price:struct<currencycode:string,value:double>,quantity:int,serialnumbers:array<string>,sku:string>>"
from itertools import accumulate
levels = accumulate((c=="<")-(n==">") for c,n in zip(' '+S,S+' '))
delim = "".join([c,"\n"][c=="," and lv==2] for c,lv in zip(S,levels) if lv>=2)
parts = delim.split("\n")
print(parts)
['orderlineid:string', 'ordernumber:string',
'price:struct<currencycode:string,value:double>',
'quantity:int', 'serialnumbers:array<string>', 'sku:string']
我有一些有限结构的动态字符串,使用基本的 .split() 命令无法按预期拆分。有哪些方法可以达到预期效果?
示例字符串:
"array<struct<orderlineid:string,ordernumber:string,price:struct<currencycode:string,value:double>,quantity:int,serialnumbers:array<string>,sku:string>>"
拆分目标:
['orderlineid:string', 'ordernumber:string', 'price:struct<currencycode:string,value:double>','quantity:int','serialnumbers:array<string>', 'sku:string']
重要通知:有人建议去掉字符串的开头和结尾并使用逗号,这对这个问题不起作用,因为请看嵌套结构还包括逗号,我们不想在其中拆分。
规则:
第一个结构总是在开头的“array”之后。第二个结构可能是也可能不是。如果没有第二个结构(我称之为嵌套结构)解决方案很容易在摆脱非字母数字字符后在逗号上使用拆分函数。但是当我有嵌套结构时,该结构内部也有逗号,我想将其作为一个整体而不拆分。
这看起来像是嵌套结构编码。您似乎想要第二层嵌入的子结构的内容。因此,您可以计算每个字符位置的嵌套级别,排除级别 0 和 1,并在级别 2 的逗号上拆分。由于还有其他逗号,首先用另一个字符替换可拆分逗号将允许您使用常规拆分提取:
S = "array<struct<orderlineid:string,ordernumber:string,price:struct<currencycode:string,value:double>,quantity:int,serialnumbers:array<string>,sku:string>>"
from itertools import accumulate
levels = accumulate((c=="<")-(n==">") for c,n in zip(' '+S,S+' '))
delim = "".join([c,"\n"][c=="," and lv==2] for c,lv in zip(S,levels) if lv>=2)
parts = delim.split("\n")
print(parts)
['orderlineid:string', 'ordernumber:string',
'price:struct<currencycode:string,value:double>',
'quantity:int', 'serialnumbers:array<string>', 'sku:string']