首页 > 解决方案 > 如何解析嵌套的逗号分隔的括号表达式列表

问题描述

我知道如何使用 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

我不知道如何组合这两个正则表达式。有人可以帮我吗?谢谢。

标签: pythonregexpcre

解决方案


您可以使用

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

推荐阅读