在包含括号的括号内查找不同长度的字符串

时间:2014-01-07 22:38:48

标签: python regex string python-2.7

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

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次重复,在这种情况下{ {1}}或所有字符串。但是正如您所看到的那样,似乎没有这样做,因为正在运行

.代替newList.append(prog.match(part))

返回newList.append(prog.split(part))

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

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

在这种特殊情况下,您可能完全使用正则表达式而不是。如果您只需要执行一次此拆分操作,则可以使用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

在这种情况下,正则表达式首先匹配任何字母和数字序列,然后匹配其他所有内容。请注意,此正则表达式不会尝试验证初始单词后面的字符串是否括在括号中,并且不会尝试验证括号的数量是否正确匹配。因此,正则表达式可能最终过于宽松,并匹配无效的字符串,具体取决于您的特定用例。