首页 新闻 会员 周边 捐助

【python】请问如何区分字符串里的层级?

0
悬赏园豆:20 [已解决问题] 解决于 2018-09-20 18:16

有下面一个字符串
str = 'A [ B { C | D } | E ]'
字符串里面有两个竖线'|',可是这两个竖线的层级不一样,第二个竖线分割B { C | D }和E,第一个竖线分割C和D,请问用什么方法才能让程序知道第一个竖线是比第二个竖线低一个层级呢?
想要的输出结果是一层一层分解:
['A', 'B { C | D } | E']
['A', ['B { C | D }','E']]
['A', ['B','[ C | D ]','E']]
['A', ['B',['C','D'],'E']]

芽衣的主页 芽衣 | 菜鸟二级 | 园豆:384
提问于:2018-09-20 08:33
< >
分享
最佳答案
1

先帮你解决第一个问题吧:用什么方法才能让程序知道第一个竖线是比第二个竖线低一个层级呢?
'''Pyhon
"""
这里多加了个| 不影响,只是为了让输出更加直观
"""
a = 'A|[B|{C||D}|E]'
"""定义字典用来存放字符串位置及层次"""
c = {}
"""计算字符串长度循环用"""
num = len(a)
n = 0
"""找到[{说明进入了高层,找到]}说明退出高层"""
find = 1
while n<num:
if (a[n] == "[") | (a[n] == "{") :
find += 1
if (a[n] == "]") | (a[n] == "}"):
find -= 1
if a[n]=='|':
d = c.setdefault(find,[n])
if d != [n]:
c[find].append(n)
n += 1
print(c)
"""
输出结果:{1: [1], 2: [4, 11], 3: [7, 8]}
键值表示层次,value表示|所在的位置
"""
'''

收获园豆:19
开心的小草 | 菜鸟二级 |园豆:243 | 2018-09-20 16:21

谢谢你的热心回答!知道各个竖线的所在层数就可以,感谢你又解决了我的问题!
你太棒了,我要用一首诗来歌颂你。
开荒筋骨困
心头泪痕痕
小雨悄然降
草原万物生

芽衣 | 园豆:384 (菜鸟二级) | 2018-09-20 18:15

@芽衣: 你想得到的最终结果就是['A', ['B',['C','D'],'E']],中间的过程无须注意,如果这样的话用递归的方法可以很好的解决,正好我刚刚学到函数的地方,我写粗略的写了下,你可以看看
"""
将字符串转化成列表
前后分别加上[],为了方便递归
"""
s = 'A[B{C|D}|E]'
a = list(s)
a.append(']')
a.insert(0,'[')
"""删除字符串中的|,因为最后不需要"""
for item in a:
if item == '|':
a.remove('|')
"""定义全局变量"""
NUM = 0 #计数
"""定义递归函数"""
def recursio(s,star,end=None,b=None):
global NUM #声明全局变量
NUM = star
li = []
while 1:
if (a[NUM] == "[") | (a[NUM] == "{"): #进入高层
d = recursio(s,NUM+1,end)
li.append(d)
if NUM==end: #判断结束
return li
if (a[NUM] == "]") | (a[NUM] == "}"): #退出高层
NUM +=1
return li
if (a[NUM]!="[") & (a[NUM]!="]"): #将在一个[]中的元素放在一个列表中
li.append(a[NUM])
NUM +=1
num = len(a)
L = recursio(a,0,num) #调用递归函数
L = L[0] #去除第一次加的[ ]
print(L)

开心的小草 | 园豆:243 (菜鸟二级) | 2018-09-20 20:43

@开心的小草: 哎呀 你真是帮人帮到底送佛送到西 现在很少能遇到像你这么有佛心的人了 真心感谢你详尽完美的回答!

芽衣 | 园豆:384 (菜鸟二级) | 2018-09-23 18:28
其他回答(3)
0

第1个竖线在 {} 中,第2个竖线在 []

dudu | 园豆:30778 (高人七级) | 2018-09-20 10:36

你好!怎么判断第一个竖线在{}中,而第二个竖线在[]中呢?

支持(0) 反对(0) 芽衣 | 园豆:384 (菜鸟二级) | 2018-09-20 12:26
0

没看懂...想要实现什么效果?

收获园豆:1
会发光 | 园豆:258 (菜鸟二级) | 2018-09-20 13:51

你好!只要能辨别字符串里的各个竖线属于什么层级就可以了,不一定要做得像问题里的输出结果。
例如,第一个竖线和第二个数线属于不同层级,第二个竖线是最上层,第一个竖线是第二层。

支持(0) 反对(0) 芽衣 | 园豆:384 (菜鸟二级) | 2018-09-20 14:43

@芽衣: 从左往右属于第几个竖线?

支持(0) 反对(0) 会发光 | 园豆:258 (菜鸟二级) | 2018-09-20 15:02

@会发光: 从左往右每个竖线各属于第几层级

支持(0) 反对(0) 芽衣 | 园豆:384 (菜鸟二级) | 2018-09-20 17:36

@芽衣: 这个没啥意义啊,如果单纯的输出每个竖线所在的层级,比如|第一层,|第二层,|第三层,你啥也得不到呀..还是我理解的有问题
s = 'A [ B { C | D } | E ]' 比如这个字符串,我告诉你第一个竖线属于第一级,第二个竖线属于第二级,你能分清啥是啥么...

支持(0) 反对(0) 会发光 | 园豆:258 (菜鸟二级) | 2018-09-20 17:46

@会发光: 知道第二个竖线属于第一级,第一个竖线属于第二级之后,我就可以拆分这个字符串了,例如原始字符串是A [ B { C | D } | E ],先把A和[]去掉,变成B { C | D } | E,然后从第一级竖线拆分之后变成B { C | D }和E,去掉B和{}变成C | D,再从第二级竖线拆分成C和D。
知道竖线的层级之后就可以解释这个字符串所表达的意思了。
如果不知道各个竖线是那个层级,就会产生错误的解释,例如先拆分第一个竖线(第二层级)的话,就变成B { C和D } | E了,但正确的顺序是应该要先拆分第二个竖线(第一层级)。
开心的小草已经帮我解决了问题,但还是要谢谢你的热心回答!
下次提问的时候也希望看到你的身影哦!

支持(1) 反对(0) 芽衣 | 园豆:384 (菜鸟二级) | 2018-09-20 18:13
0

你这个已经要规则解析啦..
最好的办法是用堆算法.

吴瑞祥 | 园豆:29449 (高人七级) | 2018-09-20 16:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册