2015-05-01 6 views
5

Gibt es eine Möglichkeit, Indizes für übereinstimmende Klammern in einer Zeichenfolge zu erhalten? Zum Beispiel für diesen:Indizes übereinstimmender Klammern in Python

text = 'aaaa(bb()()ccc)dd' 

würde Ich mag einen Wörterbuch mit Werten erhalten:

result = {4:14, 7:8, 9:10} 

was bedeutet, dass Klammern auf Index 4 und 14 passen, 7 und 8 eine so weiter. Vielen Dank.

+1

Es ist klar, dass es [nur einen offensichtlichen Weg] gibt (http://programmers.stackexchange.com/questions/96411/concrete-example-of-pythons-only-one-way-to-do-it- Maxime) einfache Algorithmen in Python zu schreiben, da du innerhalb von 5 Minuten dreimal die gleiche Antwort erhalten hast. –

Antwort

6

Sie eine automatisierte Art und Weise bedeuten? Ich glaube nicht.

Sie müssen ein Programm erstellen, indem Sie einen Stapel verwenden, in dem Sie den Index drücken, wenn Sie eine öffnende Klammer finden und wenn Sie eine schließende Klammer finden.

In Python können Sie leicht eine Liste als Stapel, verwenden, da sie die append() und pop() Methoden.

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 

Hoffe das hilft.

+1

Ja, es funktioniert, vielen Dank. –

+0

Gern geschehen. – Baltasarq

+0

Ich stimme zu, dass ein Stack der richtige Weg ist. Dies fängt jedoch nur unausgewogene _open_ Klammern ein: Zu viele _close_ Klammern verursachen einen Pop von einer leeren Liste. – xnx

4

Die Standardmethode zur Überprüfung auf ausgewogene Klammern ist die Verwendung eines Stapels. In Python, kann dies durch Anhängen an und knallend aus einer Standardliste erfolgen:

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) 

Ergebnis:

In [58]: d 
Out[58]: {4: 14, 7: 8, 9: 10}