首页 > 解决方案 > 如何在python中根据'and'或'or'分割字符串?

问题描述

假设我有一个字符串 s = SU 3180 和(CMG 3200 或 SU 3210)。我需要将此字符串拆分为树形图,例如:

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

主要目标是显示与和/或拆分的差异,如图所示。例如,我在拆分之间用连字符显示了 or 拆分。我不知道我应该如何进行。欢迎任何想法!

标签: pythonregexsplittreenlp

解决方案


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

([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的右上角面板中进行了说明。如果您愿意,您还可以在此链接中观看它如何与一些示例输入匹配。


您可以开始使用更复杂的表达式(?R)来检查括号是否平衡,然后逐级(深度)捕获括号前后的内容,将其传递给 for 循环,并基于该设计一些方法逐级打印树,这非常复杂:

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

或者

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

演示

参考

匹配平衡括号的正则表达式


推荐阅读