Python 查找嵌套括号中的所有字符串

Python 查找嵌套括号中的所有字符串,python,regex,string,Python,Regex,String,如何找到嵌套括号中的字符串 假设我有一根绳子 uv(wh(x(yz)) 我想找到括号中的所有字符串(所以wh,x,yz) 上面的代码只找到yz 我可以修改此正则表达式以查找所有匹配项吗?字符串拆分是否可以代替正则表达式 s='uv(wh(x(yz))' match=[''.join(x for x in i if x.isalpha()) for i in s.split('(')] >>>print(match) ['uv', 'wh', 'x', 'yz'] >&g

如何找到嵌套括号中的字符串 假设我有一根绳子

uv(wh(x(yz))
我想找到括号中的所有字符串(所以wh,x,yz)

上面的代码只找到yz


我可以修改此正则表达式以查找所有匹配项吗?

字符串
拆分
是否可以代替正则表达式

s='uv(wh(x(yz))'
match=[''.join(x for x in i if x.isalpha()) for i in s.split('(')]
>>>print(match)
['uv', 'wh', 'x', 'yz']
>>> match.pop(0)
您可以弹出第一个元素,因为如果它包含在括号中,那么第一个位置将为空,这是您不希望看到的,如果它不为空,则意味着它不在括号中,因此您也不希望看到它

因为这不够灵活,所以像这样的方法是可行的:

def match(string):
    unrefined_match=re.findall('\((\w+)|(\w+)\)', string)
    return [x for i in unrefined_match for x in i if x]

>>> match('uv(wh(x(yz))')
['wh', 'x', 'yz']

>>> match('a(b(c)de)')
['b', 'c', 'de']

使用regex这样的模式可能会起作用:

\((\w{1,})
结果:

['wh', 'x', 'yz']

您当前的模式会跳过
,而不会将它们视为捕获组。

如果您知道如何从PHP正则表达式转换为Python,那么您可以使用此方法

\(((?>[^()]+)|(?R))*\)

要获取所有正确插入括号的文本:

import re

def get_all_in_parens(text):
    in_parens = []
    n = "has something to substitute"       
    while n:
        text, n = re.subn(r'\(([^()]*)\)', # match flat expression in parens
                          lambda m: in_parens.append(m.group(1)) or '', text)
    return in_parens
例如:

>>> get_all_in_parens("uuv(wh(x(yz))")
['yz', 'x']
注:由于参数不平衡,结果中没有
'wh'

括号是否平衡;它返回所有三个嵌套的子字符串:

>>> get_all_in_parens("uuv(wh(x(yz)))")
['yz', 'x', 'wh']
>>> get_all_in_parens("a(b(c)de)")
['c', 'bde']

如果你找不到一个好的正则表达式,试试这个主题:看起来OP不想让“uv”匹配,因为它不在parens中。我可以弹出“uv”,但例如-a(bc)de。。s=“a(bc)de”match=[''.join(如果x.isalpha()中x代表x)s.split中i代表i('(')]打印匹配给出['a','bcde']@Illusionist,我已经更新了我的回答。这对你有用吗?谢谢,但这不会从a(b(c)de中得到“de”)你没有在你的问题中指出这是可能的!@Illusionist请不要在评论中添加答案要求。在你的问题中,你应该为每个你想通过的测试用例举一个例子。坦率地说,我觉得这也有点粗鲁。谢谢,对不起,我没有意识到这是粗鲁的。
>>> get_all_in_parens("uuv(wh(x(yz)))")
['yz', 'x', 'wh']
>>> get_all_in_parens("a(b(c)de)")
['c', 'bde']