2016-05-04 17 views
-1

Ich versuche, eine Regex-ähnliche Zeichenfolge zu analysieren, mit Format wie folgt aus:Parsing eine Regex-ähnliche Zeichenfolge

  • Die einzigen Zeichen, die maskiert werden müssen: [, \ und -;
  • Eine gültige Zeichenfolge kann eine Folge von:
    • "regular characters", z.B. a, b
    • "entkommene Sonderzeichen", z.B. \\, \[
    • Sequenzen, die über zwei enthalten sind und von einem Paar Klammern, z.B. [abc], [a\]]

Zum Beispiel abc[def]g, abc\-\[[def\]]gh\\ sind beide gültig Saiten.

Gibt es eine Möglichkeit, die Zeichen-/Zeichenklasse (im dritten Fall oben) bei jedem Index zu bekommen? Die Verwendung von reinem regex/sed oder einer Python-Bibliothek funktioniert für mich.

+0

können Holen Sie die Zeichen-/Zeichenklasse (im dritten Fall oben) bei jedem Index <- - was bedeutet das? – sweaver2112

+0

Ich bin auch durch deine Frage verwirrt. Es scheint Methode zu sein, was du da hast ist bereits gültige Regex, also könntest du es einfach als Regex Muster verwenden und damit fertig werden, aber sicher kann es nicht so einfach sein, also bin ich mir wirklich nicht sicher was du ' re frage wirklich. –

+0

Sorry über die Verwirrung - was ich meinte ist im Wesentlichen ich kann die einzelnen regulären Zeichen und Zeichengruppen, z. "abc [def] g" wird zu [a, b, c, [d, e, f], g]. Es ist kniffliger als reguläre Regex, weil die einzigen Zeichen, die es zu entkommen gilt, '[' '' '' '' '' sind. Wenn ich also einen String wie '\ 'habe, wäre es kein gültiger Regex, sondern ein gültiger String in dieser Grammatik. Mit mehr Gedanken denke ich, ich werde es in Python char-by-char analysieren. –

Antwort

0

In der Regel können Sie nicht Zeichen für Zeichen analysieren, sondern müssen es analysieren
Konstrukt von Konstrukt.

Die Kenntnis der Gruppe, die übereinstimmte, sagt Ihnen, was das Konstrukt ist.
Wenn die Klasse Konstrukt übereinstimmt, müssen Sie es Inhalt
getrennt von der Haupt Regex analysieren.

du überprüfen würden alle in (Pseudo-Code)

while (regex find)
{
wenn Gruppe 1 abgestimmt // das Zeichen entkam
sonst
wenn die Gruppe 2 angepasst// a nicht-Klasse Start oder nicht-entkam char
// prüfen, ob es entgangen sein sollte, oder ist ein metachar
sonst
wenn Gruppe 3 angepasst // Klasse Inhalt
// analysieren hier die Klasse Inhalt
sonst
wenn Gruppe 4 angepasst // Fehler
}

Zum Beispiel Zwecke ..

(?s)(?:\\(.)|([^\[])|\[((?:\\.|[^\]])*)\]|(.))

Expanded
(?s)    # Dot all modifier 
(?: 
     \\     # Escape anything 
     (.)    # (1) 
    |     # or, 
     ([^\[])   # (2), Anything that does not start a char class 
    |     # or, 
     \[     # Start of char class 
     (     # (3 start) 
      (?:     # ---------- 
       \\ .    # Escape anything 
      |     # or, 
       [^\]]    # Anthing that does not end a char class 
      )*     # ---------- 
    )     # (3 end) 
     \]     # End of char class 
    |     # or, 
     (.)    # (4), Error, probably an unbalanced '['  
)