python - 如何解析嵌套的逗号分隔的括号表达式列表
问题描述
我知道如何使用 Python 正则表达式模块来解析嵌套括号。这个正则表达式
\(([^()]*+(?:(?R)[^()]*)*+)\)
正确找到最外层的括号
some (text)(text here(possible text)text(possible text(more text)))end text
(这里的例子)
我也知道如何在逗号分隔的列表中查找项目:
[^,]+(?=,?)
正确匹配列表的元素
dgad asg , adgda adg, a, g, asdgdg,dg sfg
(见这里)
但我需要这两者的结合。我需要解析逗号分隔列表的元素,其中元素本身可能包含括号(其中包含逗号分隔列表)。在这个列表中
dg(dsfsd, (d,d,g)(g,as(d,f) fdg) sdfs, sf)ad asg , adgda (a) adg, a, g, asdgdg,dg sfg(f,g, (dff, d)df, g) kd
我需要将元素标识为:
first: dg(dsfsd, (d,d,g)(g,as(d,f) fdg) sdfs, sf)ad asg
second: adgda (a) adg
third: a
fourth: g
fifth: asdgdg
sixth: dg sfg(f,g, (dff, d)df, g) kd
我不知道如何组合这两个正则表达式。有人可以帮我吗?谢谢。
解决方案
您可以使用
r'(?>(\((?>[^()]*(?1)?)*\))|[^,])+'
查看正则表达式演示
细节
(?>(\((?>[^()]*(?1)?)*\))|[^,])+
- 1 次或多次出现(以避免空字符串匹配):(\((?>[^()]*(?1)?)*\))
- 捕获组 1(定义为能够使用子程序)匹配:\(
- 一种(
(?>[^()]*(?1)?)*
- 除了可选的整个 Group 1 模式之外的任何 0+ 字符(在此处(
递归))
\)
- 一种)
|
- 或者[^,]
- 任何字符,但,
Python演示:
import regex as re
rx = r"(?>(\((?>[^()]*(?1)?)*\))|[^,])+"
s = "dg(dsfsd, (d,d,g)(g,as(d,f) fdg) sdfs, sf)ad asg , adgda (a) adg, a, g, asdgdg,dg sfg(f,g, (dff, d)df, g) kd"
matches = re.finditer(rx, s)
for m in matches:
print(m.group().strip())
输出:
dg(dsfsd, (d,d,g)(g,as(d,f) fdg) sdfs, sf)ad asg
adgda (a) adg
a
g
asdgdg
dg sfg(f,g, (dff, d)df, g) kd
推荐阅读
- javascript - 将多行数据从表传递到模态
- git - 如何更新我的 Github Pages 网站?
- css - 在 SVG 上的多个复杂路径上垂直居中和水平居中一些数字
- java - 如何通过中间层调用Java中的方法?
- docker - 审计通过 kubectl exec 执行的 Shell 命令
- android - Firebase Firestore 未写入任何值
- javascript - 声明后向 JSX.Element 添加属性
- javascript - 将变量传递给打包 json 脚本
- angular - Angular - 使用“标题”作为@Input
- html - 在 DTL django 的查询集中检查是否存在