Python 在包含括号的括号内查找长度可变的字符串

Python 在包含括号的括号内查找长度可变的字符串,python,regex,string,python-2.7,Python,Regex,String,Python 2.7,我想要一个字符串输入(可能会有所不同),它将具有某种形式 aString = "foo1(bar1(foo2bar2)) foo3(bar3)" 我想使用某种将返回的正则表达式 [[foo1, (bar1(foo2bar2))], [foo3, (bar3)]] 实际字符串将由字母、数字、空格和括号组成。我首先使用aString.split()将它按空格分割,然后用外圆括号将每个部分分割。到目前为止,我得到的是: import re aString = "foo1(bar1(foo2bar

我想要一个字符串输入(可能会有所不同),它将具有某种形式

aString = "foo1(bar1(foo2bar2)) foo3(bar3)"
我想使用某种将返回的正则表达式

[[foo1, (bar1(foo2bar2))], [foo3, (bar3)]]
实际字符串将由字母、数字、空格和括号组成。我首先使用
aString.split()
将它按空格分割,然后用外圆括号将每个部分分割。到目前为止,我得到的是:

import re

aString = "foo1(bar1(foo2bar2)) foo3(bar3)"
aList = aString.split()
newList = []
for part in aList:
    index1 = part.find('(')
    index2 = part.rfind(')')
    aLen = index2 - index1 - 1
    prog = re.compile(r'(\(.{,aLen}\))')
    newList.append(prog.split(part))

print newList
其中返回以下内容:

[['foo1(bar1(foo2bar2))'], ['foo3(bar3)']]
我对这种形式的正则表达式的理解是,
将匹配所有字符串,
{,aLen}
将匹配上一个正则表达式的零和
aLen
重复,在本例中是
或所有字符串。但是,正如您所看到的,它似乎没有这样做,因为运行

newList.append(prog.match(part))
而不是
newList.append(prog.split(part))

返回
[None,None]

我对正则表达式没有太多的经验,所以很可能我误解了不同的正则表达式的含义或者它们是如何工作的


任何帮助都将不胜感激

在这种特殊情况下,您可能根本不用正则表达式。如果只需要执行此拆分操作一次,则可以使用
string.partition
简单地按第一次出现的外括号进行拆分

def parse(string):
    front, paren, back = string.partition('(')
    return [front, paren + back]

def parse_many(string):
    return [parse(s) for s in string.split()]

aString = "foo1(bar1(foo2bar2)) foo3(bar3)"
print parse_many(aString)
但是,如果您的输入比这个更复杂(如果您试图实现某种解析器),那么您可能希望研究使用实际的解析库,例如pyparsing

如果您确实想使用正则表达式,那么以下操作应该可以:

import re

aString = "foo1(bar1(foo2bar2)) foo3(bar3)"
aList = aString.split()
newList = []
for part in aList:
    prog = re.compile(r'([a-zA-Z0-9]*)(.*)')
    newList.append(prog.split(part)[1:3])

print newList

在本例中,正则表达式首先匹配字母和数字的任何序列,然后将匹配其他所有序列。请注意,此正则表达式不会尝试验证初始单词后面的字符串是否包含在括号中,也不会尝试验证括号的数目是否正确匹配。结果,正则表达式可能会过于宽松,并根据您的特定用例匹配无效的字符串。

输入字符串可能会变得相当复杂,形式可能是
foo1bar1(foo2bar2(foo3bar3(foo4bar4(foo5bar5)))
foo1bar1(foo2bar2(foo3bar3(foo4bar4)foo5bar5(foo6bar6)))
或者其他类似的东西。我仍然希望像以前一样分隔字符串,因此在第一种情况下,
[foo1bar1,[(foo2bar2,[(foo3bar3,[(foo4bar4,[(foo5bar5)],')'],')'],')'],'],'),'],')']
。在这种情况下,您会建议使用解析库或某种使用regex的递归函数吗?@Dannnno——是否会有逗号?例如,字符串是否类似于
f1(a1,f2(a2,a3),f4(f5(a1))
?@Dannnno——是否需要在最终输出中保留括号,在这种精确的配置中,或者如果删除括号,是否可以接受?老实说,我不确定。实际上,我还没有编写处理括号的代码部分。如果它们被删除可能就没问题了。因此,您需要的是一个Fname(args)并将其转换为[[Fname,args],[other_Fname,[nested_Fname,args]]等的东西?@OmegaOuter No.我想要采用上面所示的形式的字符串,或者在下面的答案注释中,并返回所有圆括号的内部,而不删除圆括号。括号的位置和数量会有所不同(它们将始终打开和关闭),括号之间区域的内容/长度也会有所不同。我确实阅读了下面的评论,我真诚地认为两者的预期结果是不同的。在最初的问题中,你不需要像下面的问题那样进行嵌套遍历,在第一个问题中,你可能需要任意数量的表达式。我认为您应该编辑原始问题,以解决您正在寻找的确切行为。