2016-07-08 3 views
0

Ich bin auf der Suche nach einem Suchmuster. Es gibt ein bestimmtes Muster, dem in einem anderen Muster nicht gefolgt werden sollte. Irgendwie, wenn dieses Muster vorhanden ist, sollten < und > Zeichen von Escape \ Zeichen gefolgt werden. Die Zeichen können vorhanden sein, wenn sie nicht im Muster enthalten sind.Regex: ein Zeichen sollte vorhanden sein, gefolgt von einem weiteren Escape-Zeichen

Ich habe versucht, es auf diese Weise tun: input_string = '<First tag:<Second tag:hello>tag ends>' re.findall('(?<!\\)<.*?:.*?(?<!\\)>',input_string)

Erwartete Ausgabe: ['<Second tag:hello>']

Was ich habe ist: ['<First tag:<Second tag:hello>']

ich mit diesem Muster versucht: (?<!\\)<[^(?<!\\)<.*:]+:[^(?<!\\)<.*:]+?(?<!\\)>

Dies geht das obige Beispiel , aber für diesen Eingang: input_str = '<First tag:\<Second tag:hello>tag ends> <First tag:<Second tag:hello\>tag ends> <First tag:\<Second tag:hello\>tag ends>' schlägt es fehl.

Dies ist die erwartete Ausgabe: ['<First tag:\<Second tag:hello>','<Second tag:hello\>tag ends>','<First tag:\<Second tag:hello\>tag ends>']

+1

nicht regex verwendet alles mit unendlicher Verschachtelung zu analysieren. Es wird nicht funktionieren. –

+0

Sie wollen also die innerste nicht-maskierte '<' to '>'? Das sollte mit Regex machbar sein. – TemporalWolf

+0

@TemporalWolf Ja, genau .. mit einem ':' dazwischen '<' and '>' – Sohn

Antwort

0

(?<!\\)<(?:[^<>]|\\<|\\>)+:(?:[^<>]|\\<|\\>)*[^\\]>

Gibt:

$1 - <First tag:\<Second tag:hello> 
$1 - <Second tag:hello\>tag ends> 
$1 - <First tag:\<Second tag:hello\>tag ends> 

für Ihr zweites Beispiel:

Aufteilung:

(?<!\\) Negativer Blick hinter -> es kann nicht mit einem \ davor beginnen.

< Beginnen Sie mit einem Öffnungswinkel

eine Nicht-Erfassung Gruppe starten (?:: Ich gruppieren Sachen wollen, aber ich will nicht, zusätzliche Gruppen

[^<>] Any character that is not an angle bracket 

| or 

\\< An escaped left bracket 

| or 

\\> An escaped right bracket 

)+ die Gruppe schließen ... dupliziere es ein oder mehrere Male.

: Ein Semikolon

(?:[^<>]|\\<|\\>)* Die gleiche nicht-einfangende Gruppe, 0 oder mehrmals.

[^\\]> Schließlich muss es in alles außer einem \ enden, gefolgt von einer rechtwinkligen Klammer. \\ wird verwendet, da es maskiert werden muss.

regex101 Link, wenn Sie es testen möchten.

Diese aktualisierte regex akzeptieren: <a:a> als ein Beispiel für die kleinste gültige Übereinstimmung

+0

: Immer noch akzeptiert es einige unerwünschte Eingaben, wie '' und '/ ' ..Ich möchte, dass dies in diesem Format sein soll. < ', aber nicht geschachtelt. – Sohn

+0

Behoben, wie gewünscht. – TemporalWolf

+0

Danke für Ihre Mühe. aber sorry, das zu sagen .. kann ich verwirrt sein .. '' hier diese 'Einige tag' und' Ein anderes tag' kann '<' and '>' innen enthalten, wenn diese zeichen nicht im muster sind. '' dies wird akzeptiert als 2nd '<' ist nicht im Muster. – Sohn

Verwandte Themen