【问题标题】:How to split a string on basis of 'and' or 'or' in python?如何在python中根据'and'或'or'分割字符串?
【发布时间】:2019-09-18 01:11:46
【问题描述】:

假设我有一个字符串 s = SU 3180 和(CMG 3200 或 SU 3210)。我需要把这个字符串拆分成这样的树形图:

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

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

【问题讨论】:

  • 你有很多问题要解决:你需要处理括号、优先顺序、递归或迭代地解析长字符串,最后打印一个布局合理的表示 - 这有点多在一个问题中提出问题,而不尝试自己解决。请提供您自己尝试过的代码并从那里询问。
  • 您需要为此编写一个解析器,这可能是您的任务的重点。正则表达式不适合这项工作。
  • 我同意 Grismar 的观点,我们需要看看你已经拥有什么,因为这是一个非常复杂的问题,而且这样更容易提供帮助。话虽如此,您可以查看像 Lark 这样的语法解析器。
  • @TimBiegeleisen 大多数解析器使用正则表达式进行标记。

标签: python regex split tree nlp


【解决方案1】:

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

([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

【讨论】:

  • 它只适用于这个特定的输入,而不是任意的树
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多