2017-02-17 11 views
1

Ich habe Probleme mit Regex, ich habe das Wiki gelesen und herumgespielt, aber ich kann nicht scheinen, das richtige Spiel zu machen.Python entfernen innere Klammern und halten äußere Klammern

Ich möchte alle möglichen Klammern innerhalb der äußeren Klammern entfernen, während ich die äußeren Klammern und den Text nach innen halte.

Könnte dies einfach in Python ohne Regex gelöst werden?

+0

Regex ist nicht so gut für den Umgang mit Nesting. – khelwood

+0

Woher bekommen Sie Text mit diesen Klammern? – Blender

+0

Ich habe Namens-Entity-Tagging getan. Und Namen werden mit [] um sie herum getaggt. In diesem Fall glaubt der Tagger, dass wir 3 verschiedene Entitäten haben, da Donald eine Entität, Trump eine Entität und Donald Trump eine andere Entität ist. Dies ist ein besonderer Fall, wenn "Donald" am Anfang des Textes erwähnt wurde und "Trump" in der Mitte und dann die neue Kombination "Donald Trump" am Ende. – Isbister

Antwort

1

Im speziellen Fall von zwei benachbarten Klammerausdrücke in einem Paar von Klammern, können Sie

string = re.sub(r'\[\[([^][]+)\] \[([^][]+)\]\]', r'[\1 \2]', string) 

tun, aber vielleicht ist es genug für Ihre Bedürfnisse .

1

Regex wird Ihnen mehr Schaden als gut für solche Probleme verursachen. Sie müssen eine Parsing-Logik basierend auf Grammatik oder Regeln schreiben.

Sie könnten zum Beispiel Finite-State-Transducer (1, 2) betrachten, die eine geeignete Methode zum Parsen verschachtelter Konstruktionen wäre, aber es ist komplexer als Regex zu verstehen und zu verwenden.

0
In [1]: import re 
In [2]: before='blablabla [[Donald] [Trump]] blablabla' 
In [3]: l=before.find('[')+1 
In [4]: r=before.rfind(']') 
In [5]: before[:l] + re.sub(r'[][]','',before[l:r]) + before[r:] 
Out[5]: 'blablabla [Donald Trump] blablabla' 

Nur zeigen einen Weg zu gehen, Fehlerprüfung/Handhabung wurde weggelassen. Dies gilt nicht bequem erweitert auf eine beliebige Anzahl von benachbarten Klammerausdrücke

+0

Cool, ja, es löst diesen speziellen Fall. Ich habe meine Beispiele nicht ausreichend getestet. Da sie aussehen können wie: "Ich denke [Donald] ist der Vorname des Präsidenten [Trump], aber einige Leute nennen ihn [[Donald] [Trump]], damit er [[Donald] [Trump] genannt werden soll" I wird meine Frage aktualisieren. – Isbister

Verwandte Themen