如何解析带括号的表达式的嵌套逗号分隔列表

时间:2018-06-21 09:48:49

标签: python regex pcre

我知道如何使用Python regex模块解析嵌套的括号。这个正则表达式

\(([^()]*+(?:(?R)[^()]*)*+)\)

正确找到其中的最外面的括号

some (text)(text here(possible text)text(possible text(more text)))end text

(例如here

我还知道如何在逗号分隔的列表中查找项目:

[^,]+(?=,?)

正确匹配列表中的元素

dgad asg , adgda adg, a, g, asdgdg,dg sfg

(请参阅here

但是我需要将两者结合起来。我需要解析逗号分隔列表的元素,其中元素本身可能包含括号(其中包含逗号分隔的列表)。在此列表中

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

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

1 个答案:

答案 0 :(得分:3)

您可以使用

r'(?>(\((?>[^()]*(?1)?)*\))|[^,])+'

请参见regex demo

详细信息

  • (?>(\((?>[^()]*(?1)?)*\))|[^,])+-出现1次或多次(以避免空字符串匹配):
    • (\((?>[^()]*(?1)?)*\))-捕获组1(定义为能够使用子例程)匹配:
      • \(-一个(
      • (?>[^()]*(?1)?)*-除()以外的任意0+个字符,后跟可选的整个第1组模式(在此处递归)
      • \)-一个)
    • |-或
    • [^,]-除,以外的任何字符

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