Regex-Zeilenanfang im Zeichensatz

8

Nehmen wir an, ich möchte nach einem 'b' suchen, das entweder am Anfang der Zeile oder gefolgt von 'a' auftritt.

Warum stimmt re.match('[\^a]b','b') nicht überein, während re.match('^b','b') das tut?

Update: Ich habe festgestellt, dass ich search anstelle von match hätte verwenden sollen. Ich möchte, dass es für Dinge wie 'b', 'cab', 'ab', 'bc' und 'abd' positiv ist.

    
highBandWidth 02.11.2012, 16:15
quelle

2 Antworten

12

Der Regex [\^a]b stimmt entweder mit ab oder ^b überein, daher sollte er nicht mit der Zeichenfolge 'b' übereinstimmen.

Beachten Sie, dass re.match() nur am Anfang einer Zeichenfolge zutrifft, so als ob Sie am Anfang Ihrer Regex einen Stringanker haben würden ( ^ oder \A mit aktivierter Multilinienoption).

Um nach einem 'b' zu suchen, das entweder am Anfang der Zeile oder gefolgt von 'a' "auftritt, müssen Sie re.search() mit der folgenden Regex verwenden:

%Vor%

Beachten Sie, dass ich dies etwas anders interpretiere als die anderen Antworten, denke Ihre Anforderung bedeutet, dass Sie das "b" in 'bob' sowie das ab in% vergleichen möchten. co_de%, so dass der Anfang der Zeilenanforderung nur für ein 'taboo' gilt, dem nicht b vorangestellt ist.

Diese Wechselmethode in der Gruppe gibt Ihnen eine besser skalierbare Lösung als a , um ^b|ab am Anfang der Zeichenfolge oder vor b , a , x oder 2 könnten Sie folgendes verwenden:

%Vor%     
Andrew Clark 02.11.2012, 16:24
quelle
7

Deine erste Regex bedeutet wirklich:

%Vor%

Deine zweite Regex:

%Vor%

Was Sie wirklich für Ihre erste Regex wollen, ist:

%Vor%

Beachten Sie auch, dass re.match() automatisch versucht, eine Übereinstimmung zu finden, die am Anfang beginnt. Sie möchten re.search() verwenden, wenn Sie Zeichenfolgen in der Mitte der Zeichenfolge suchen möchten.

  

Angenommen, ich möchte nach einem Zeilenanfang oder 'a' oder 'x' oder '2' oder '5' suchen, gefolgt von einem 'b'. Kann ich [^ax25]b statt ^b|ab|xb|2b|5b nicht tun?

In diesem Fall würde ich tun:

%Vor%

Die Zeichenklasse kann nur gut Zeichen enthalten. Die spezielle Bedeutung des Caret ( ^ ) als eine Assertion mit der Breite Null, die dem Stringanfang entspricht, ändert sich, wenn er in einer Zeichenklasse ist: Er kann die ganze Zeichenklasse negieren, wenn sein erstes Zeichen oder das Literal-Caret ( ^ ) ist Es ist entkommen oder anderswo platziert.

    
NullUserException 02.11.2012 16:19
quelle

Tags und Links