在包含圆括号的圆括号中查找长度不等的字符串

2024-09-28 15:25:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我想采取一个字符串输入(可能会有所不同),将有一些形式

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]

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

任何帮助都将不胜感激!你知道吗


Tags: 字符串形式split空格partappendprogfoo1
1条回答
网友
1楼 · 发布于 2024-09-28 15:25:00

在这种特殊情况下,您可能根本不用regex而不用。如果您只需要执行此拆分操作一次,那么可以使用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。你知道吗

如果您想使用regex,那么下面的操作应该可以:

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

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

相关问题 更多 >