如何在python中基于“and”或“or”拆分字符串?

2024-06-01 20:35:16 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个字符串s=su3180和(cmg3200或su3210)。我需要将这个字符串拆分成树形图,例如:

               X
              / \
       SU 3180   ()
                / - \
        CMG 3200     SU 3210               

主要目标是显示与和/或拆分的差异,如图中所示。例如,我已经显示了or split,在split之间使用连字符。我不知道该怎么办。欢迎有任何想法!你知道吗


Tags: or字符串目标差异字符susplitcmg
1条回答
网友
1楼 · 发布于 2024-06-01 20:35:16

对于字符串的算法处理,我不确定,就这一种情况,你可以从这个简单的表达式开始

([A-Z]+\s+\d+)\s+and\s+\(([A-Z]+\s+\d+)\s+or\s+([A-Z]+\s+\d+)\)

换成类似的东西:

           X\n               /\\\n        \1  ()\n               /  -  \\\n       \2       \3

测试

import re

regex = r"([A-Z]+\s+\d+)\s+and\s+\(([A-Z]+\s+\d+)\s+or\s+([A-Z]+\s+\d+)\)"

string = "SU 3180 and (CMG 3200 or SU 3210)"

subst = '               X\\n               /\\\\\\n        \\1  ()\\n               /  -  \\\\\\n       \\2       \\3'

print(re.sub(regex, subst, string))

输出

           X
           /\
    SU 3180  ()
           /  -  \
   CMG 3200       SU 3210

如果您希望简化/修改/探索表达式,在regex101.com的右上面板中已经对其进行了解释。如果您愿意,还可以在this link中查看它如何与一些示例输入匹配。你知道吗


一个更复杂的表达式可以从(?R)开始检查平衡括号,然后逐层(深度)捕获括号前后的内容,通过for循环传递,并在此基础上设计一些方法逐层打印树,这相当复杂:

(?>([^(]*?)\s*([(]([^()]*|(?R))*[)])([^)]*?)\s*)  

或者

([^(]*?)\s*([(]([^()]*|(?R))*[)])([^)]*?)\s*

Demo

参考

Regular expression to match balanced parentheses

相关问题 更多 >