2 Stimmen

Regulärer Ausdruck für die Suche nach einer Zeichenkette1, auf die nie eine Zeichenkette2 folgt

Wie lässt sich ein Suchmuster für einen regulären Ausdruck erstellen, um Zeichenfolge 1 zu finden, auf die nicht (sofort oder nicht) Zeichenfolge 2 folgt?

Wenn z. B. string1="MAN" und string2="PN", wären die Suchergebnisse wie folgt:

"M": Not found
"MA": Not found
"MAN": Found
"BLAH_MAN_BLEH": Found
"MAN_PN": Not found
"BLAH_MAN_BLEH_PN": Not found
"BLAH_MAN_BLEH_PN_MAN": Not found

Idealerweise eine einlineare Suche, anstatt eine zweite Suche nach string2 durchzuführen.

PS: Verwendete Sprache ist Python

3voto

polygenelubricants Punkte 362173

Es sieht so aus, als könnten Sie Folgendes verwenden MAN(?!.*PN) . Dies entspricht MAN und verwendet einen negativen Lookahead, um sicherzustellen, dass er nicht von PN ( wie auf rubular.com gesehen ).

Gegeben MAN_PN_MAN_BLEH findet das obige Muster die zweite MAN , da es nicht gefolgt wird von PN . Wenn Sie die gesamte Zeichenkette validieren und sicherstellen wollen, dass es keine MAN.*PN dann können Sie etwas verwenden wie ^(?!.*MAN.*PN).*MAN.*$ ( wie auf rubular.com gesehen ).

Referenzen

Verwandte Fragen


Nicht-Regex-Option

Wenn die Zeichenketten wörtlich übereinstimmen sollen, können Sie auch nach Indizes für das Vorkommen von Teilzeichenketten suchen.

In Python, find y rfind geben den niedrigsten bzw. den höchsten Index des Auftretens von Teilstrings zurück.

Um also sicherzustellen, dass string1 auftritt, aber nie gefolgt von string2 und beide Erträge -1 wenn die Zeichenkette nicht gefunden wird. Es sieht also so aus, als könnten Sie einfach auf diese Bedingung testen:

string.rfind(s, string2) < string.find(s, string1)

Dies vergleicht das äußerste linke Vorkommen von string1 und das äußerste rechte Vorkommen von string2 .

  • Tritt keines von beiden auf, sind beide -1 und das Ergebnis ist false
  • Si string1 auftritt, aber string2 nicht, dann ist das Ergebnis true wie erwartet
  • Wenn beides vorkommt, dann ist der ganz rechte string2 muss sich links von der ganz linken string1
    • Das heißt, keine string1 wird immer gefolgt von string2

API-Verbindungen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X