Ich habe eine Zeichenfolge im folgenden Format: "a{1;4:6}"
und "a{1;2}b{2:4}"
, wobei die ;
zwei verschiedene Zahlen darstellt, und eine :
eine Sequenz von Zahlen darstellt. Innerhalb der Klammer kann eine beliebige Anzahl von Kombinationen aus Semikolons und Doppelpunkten stehen.Packen Sie eine Zeichenfolge in eine erweiterte Zeichenfolge
Ich möchte um es erweitern, so dass diese die Ergebnisse der Erweiterung der beiden oben genannten Beispiele:
"a{1;4:6}"
= "a1a4a5a6""a{1;2}b{2:4}" = "a1b2b3b4a2b2b3b4"
Ich habe noch nie zu tun hatte mit so etwas wie vorher, da ich normalerweise Strings in einem vorgefertigten Format bekomme, das leicht zu lesen ist. In diesem Fall muss ich die Zeichenfolge manuell analysieren.
Mein Versuch ist, die Zeichenfolge manuell aufzuteilen, immer und immer wieder, bis Sie einen Fall treffen, wo es einen Doppelpunkt oder ein Semikolon gibt, dann beginnen Sie die Zeichenfolge von dort zu erstellen. Das ist schrecklich ineffizient, und ich würde mich über jeden Gedanken zu diesem Ansatz freuen. Hier ist im Wesentlichen, was der Code aussieht (ich eine Menge davon weggelassen, nur den Punkt über schneller zu bekommen):
>>> s = "a{1;4:6}"
>>> splitted = s.split("}")
>>> splitted
['a{1;4:6', '']
>>> splitted2 = [s.split("{") for s in splitted]
>>> splitted2
[['a', '1;4:6'], ['']]
>>> splitted3 = [s.split(";") for s in splitted2[0]]
>>> splitted3
[['a'], ['1', '4:6']]
# ... etc, then build up the strings manually once the ranges are figured out.
Der Gedanke hinter Spaltung am Ende Klammer zunächst ist, dass es, dass ein garantiert Ein neuer Bezeichner mit einem zugehörigen Bereich erscheint danach. Wo gehe ich falsch? Mein Ansatz funktioniert für einfache Strings wie das erste Beispiel, aber nicht für das zweite Beispiel. Außerdem ist es ineffizient. Ich wäre dankbar für jeden Beitrag zu diesem Problem.
Sie könnten in PyParsing aussehen wollen – dawg
Sie können auch mit einigen Tricks tun dies 'eval()' - wenn Sie sind komfortabel mit, dass die Sicherheit berücksichtigt. Bei Interesse koche ich ein Beispiel. Da deine [DSL] (https://en.wikipedia.org/wiki/Domain-specific_language) nicht rekursiv ist, wird auch ein bisschen Regexing die Aufgabe erledigen und könnte eine bessere Option sein. – FujiApple
Warum ist 'b2b3b4' zwischen' a1' und 'a2'? –