python - 如何在python中根据'and'或'or'分割字符串?
问题描述
假设我有一个字符串 s = SU 3180 和(CMG 3200 或 SU 3210)。我需要将此字符串拆分为树形图,例如:
X
/ \
SU 3180 ()
/ - \
CMG 3200 SU 3210
主要目标是显示与和/或拆分的差异,如图所示。例如,我在拆分之间用连字符显示了 or 拆分。我不知道我应该如何进行。欢迎任何想法!
解决方案
对于该字符串的算法处理,我不确定,对于这种情况,您可以从这个简单的表达式开始,
([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*
演示
参考
推荐阅读
- c++ - 这个 c++ 中的货币转换器不起作用
- docker - 如何通过 kubernetes 集群(minikube)路由测试流量?
- node.js - 没有从 api 调用收到请求正文
- google-cloud-vision - Cloud Vision API - 空格作为数字分隔符
- node.js - 如何在firebase中删除匿名用户及其文档?
- jquery - 如何通过 jquery 从类中删除属性?
- android - 如何在不同颜色的 CalendarView 中获得圆圈
- python - 确保在等待期间 KeyboardInterrupt 时 with-statement 调用 __exit__()
- sql - 如何为postgres中的所有行生成随机字符串
- java - 为什么像这样处理长数据类型的内存大小会成功?