2016-04-06 14 views
0

Ich versuche, eine Regex für die folgende Situation zu schreiben. Ich habe eine Datei mit Hunderten von Wörterbüchern als Zeichenfolge.Regex zu Wörterbücher in Zeichenfolge

Beispiel:

{'a':1'} 
{{'a':1, 'b':2}{'c':3}} 
{'a':4, 'b':6} 

las ich die Datei und removed the newlines. Jetzt versuche ich split sie based on a regex.

{'a':1'}{{'a':1, 'b':2}{'c':3}}{'a':4, 'b':6} 

re.split("({.*?})", str). Das würde nicht funktionieren, weil das ganze zweite Diktat nicht zusammenpassen würde. Wie kann ich eine Regex schreiben, die mit allen Zeilen übereinstimmt, die eine Liste von Wörterbüchern zurückgibt.

+0

Woher kommen diese Daten? Ist dieses einfache Zitat nach "1" beabsichtigt? Vielen Dank. – alecxe

+2

Ihre Eingabedaten sind falsch formatiert: '{{'a': 1, 'b': 2} {'c': 3}}' ist keine gültige Python-Syntax. Wenn es sich um ein einzelnes Wörterbuch mit verschachtelten Wörterbüchern handelt, fehlen Schlüssel und ein Komma. Wenn Sie es als zwei separate Wörterbücher behandeln, haben Sie zusätzliche Klammern. – TigerhawkT3

+0

jede Chance Ihre Datei ist 'Json'? – roippi

Antwort

0

Python-reguläre Ausdrücke können verschachtelte Strukturen nicht selbst verarbeiten. Sie müssten separat Schleifen oder Rekursionen durchführen.

Allerdings haben Sie oben kommentiert, dass jede Zeile eine JSON-Antwort ist. Warum nicht json.loads() in jeder Zeile verwenden.

import json 

with open('path_to_file', 'r') as f: 
    data = [json.loads(line) for line in f] 

data ist jetzt eine Liste der Wörterbücher.

+0

Die json.loads() wird fehlschlagen, weil einige der Wörterbücher nicht die richtige Struktur haben. Ich versuche, die Zeichenfolge in Wörterbücher aufzuteilen, bevor ich eine json.loads() ausführen kann. – user3786914

+0

Also es _not_ json dann nicht. Verfügen die Daten über eine gut definierte Struktur, die analysiert werden kann? Was ist die erwartete Ausgabe für Ihre Beispieldaten? – RootTwo

0

Sie könnten einfach tun:

(\{[^{}]+\}) 
# look for an opening { 
# and anything that is not { or } 
# as well as an ending } 

In Python dies wäre:

import re 
rx = r'(\{[^{}]+\})' 
string = "{'a':1'}{{'a':1, 'b':2}{'c':3}}{'a':4, 'b':6}" 
matches = re.findall(rx, string) 
print matches 
# ["{'a':1'}", "{'a':1, 'b':2}", "{'c':3}", "{'a':4, 'b':6}"] 

Siehe a demo on regex101.com.

Verwandte Themen