Regex提取括号外以逗号分隔的表达式列表中的最后一个单词

Regex提取括号外以逗号分隔的表达式列表中的最后一个单词,regex,python-3.x,Regex,Python 3.x,我想,如果可以使用正则表达式提取逗号分隔列表中每个表达式的最后一个单词,那么这个单词应该在嵌套的括号之外 例如,对于表达式: a(bb, ccc(dddd), ee, f(gg, h(i))) jjj, kk(ll) mm, n(o, p()) qq, r 预期结果是: jjj mm qq r 我将在Python3中使用这个正则表达式。一种方法是向前看,检查后面是否不仅有逗号(或输入的结尾),而且后面是否只有成对的括号。 对于后一种检查,您需要regex解析器中的递归功能,而re不提供这种功

我想,如果可以使用正则表达式提取逗号分隔列表中每个表达式的最后一个单词,那么这个单词应该在嵌套的括号之外

例如,对于表达式:

a(bb, ccc(dddd), ee, f(gg, h(i))) jjj, kk(ll) mm, n(o, p()) qq, r
预期结果是:

jjj mm qq r

我将在Python3中使用这个正则表达式。

一种方法是向前看,检查后面是否不仅有逗号(或输入的结尾),而且后面是否只有成对的括号。 对于后一种检查,您需要regex解析器中的递归功能,而
re
不提供这种功能。图书馆支持:

import regex

s = "a(bb, ccc(dddd), ee, f(gg, h(i))) jjj, kk(ll) mm, n(o, p()) qq, r"

res = regex.findall(r"(\w+)(?=,[^()]*(\((?>(?:[^()]|(?2))*)\)[^()]*)*$|$)", s)

# Keep only the matches of the first capture group
res,_ = zip(*res)

print(res)  # ('jjj', 'mm', 'qq', 'r')

递归部分是第二个捕获组。它首先从捕获一个
)开始,然后使用
(?>
组表示基本情况,即一系列非括号和递归情况,即
|(?2)
。第二个捕获组以捕获成对的
结束)

发布您的需求,并期待有人提出定制的代码,但通常我们会感谢您自己付出更多的努力。您尝试了什么,它是如何不起作用的?对于regex来说,这似乎是一项非常非标准的任务,所以我需要一个想法。不幸的是,我没有任何想法,抱歉。这不是regexp所擅长的d代表。它不容易匹配内/外括号。谢谢,我也这么认为。我只是想看看是否有我猜不到的原始解决方案。太棒了!这正是我想要的。非常感谢。