Python中匹配括号的索引

时间:2015-05-01 17:32:37

标签: python parentheses

有没有办法在字符串中获取匹配括号的索引?例如,对于这个:

parseDateEntry(date) == parseDateAttribute(rideshareDate)

我想获得一本包含值的词典:

parseDateEntry(date).getTime() == parseDateAttribute(rideshareDate).getTime()

表示索引4和14上的括号匹配,7和8表示匹配。 非常感谢。

3 个答案:

答案 0 :(得分:11)

你的意思是一种自动化方式? 我不这么认为。

您需要使用堆栈创建程序,在找到打开的括号时按下索引,并在找到右括号时弹出它。

在Python中,您可以轻松地将列表用作堆栈,因为它们具有append()pop()方法。

def find_parens(s):
    toret = {}
    pstack = []

    for i, c in enumerate(s):
        if c == '(':
            pstack.append(i)
        elif c == ')':
            if len(pstack) == 0:
                raise IndexError("No matching closing parens at: " + str(i))
            toret[pstack.pop()] = i

    if len(pstack) > 0:
        raise IndexError("No matching opening parens at: " + str(pstack.pop()))

    return toret

希望这有帮助。

答案 1 :(得分:5)

检查平衡括号的标准方法是使用堆栈。在Python中,这可以通过附加到标准列表并从中弹出来完成:

javascript

结果:

text = 'aaaa(bb()()ccc)dd'
istart = []  # stack of indices of opening parentheses
d = {}

for i, c in enumerate(text):
    if c == '(':
         istart.append(i)
    if c == ')':
        try:
            d[istart.pop()] = i
        except IndexError:
            print('Too many closing parentheses')
if istart:  # check if stack is empty afterwards
    print('Too many opening parentheses')
print(d)

答案 2 :(得分:0)

也试试这个。

def match(str):
    stack = []
    ans = {}
    for i,ch in enumerate(str):
        if ch == "(":
            stack.append(i)
        else :
            try:
                if ch == ")":
                    ans[stack.pop()] = i
                    continue
            except:
                return False
            
    if len(stack) > 0:
        return False
    else:
        return ans

test_str = "()"
print(match(test_str))