Regular Expressions
Guarda avanti e guarda dietro
Ricerca…
Sintassi
- Aspetto positivo:
(?=pattern)
- Lookahead negativo:
(?!pattern)
- Lookbehind positivo :
(?<=pattern)
- Aspetto negativo :
(?<!pattern)
Osservazioni
Non supportato da tutti i motori regex.
Inoltre, molti motori regex limitano i pattern all'interno di lookbehind a stringhe di lunghezza fissa. Ad esempio il pattern (?<=a+)b
dovrebbe corrispondere a b
in aaab
ma genera un errore in Python.
Catturare i gruppi sono consentiti e funzionano come previsto, comprese le sottorappresentazioni. Tuttavia, il lookahead / lookbehind non è un gruppo che cattura.
Nozioni di base
Un lookahead positivo (?=123)
asserisce che il testo è seguito dallo schema dato, senza includere il pattern nella corrispondenza. Allo stesso modo, un lookbehind positivo (?<=123)
asserisce che il testo è preceduto dal modello dato. Sostituire il =
con !
nega l'affermazione.
Ingresso : 123456
-
123(?=456)
corrisponde a123
( lookahead positivo ) -
(?<=123)456
corrisponde a456
( aspetto positivo ) -
123(?!456)
fallisce ( lookahead negativo ) -
(?<!123)456
fallisce ( aspetto negativo )
Input : 456
-
123(?=456)
non riesce -
(?<=123)456
fallisce -
123(?!456)
fallisce -
(?<!123)456
corrisponde a456
Usando lookbehind per testare le conclusioni
Un lookbehind può essere usato alla fine di un pattern per assicurarsi che si concluda o meno in un certo modo.
([az ]+|[AZ ]+)(?<! )
corrisponde alle sequenze di sole lettere minuscole o solo maiuscole escludendo gli spazi bianchi finali.
Simulazione del lookbehind a lunghezza variabile con \ K
Alcuni sapori regex (Perl, PCRE, Oniguruma, Boost) supportano solo lookbehind a lunghezza fissa, ma offrono la funzione \K
, che può essere utilizzata per simulare il lookbehind a lunghezza variabile all'inizio di un pattern. Quando incontri un \K
, il testo abbinato fino a questo punto viene scartato e solo il testo che corrisponde alla parte del modello che segue \K
viene mantenuto nel risultato finale.
ab+\Kc
È equivalente a:
(?<=ab+)c
In generale, un modello della forma:
(subpattern A)\K(subpattern B)
Finisce per essere simile a:
(?<=subpattern A)(subpattern B)
Tranne quando il subpattern di B può eguagliare lo stesso testo del subpattern A - potresti ottenere risultati leggermente diversi, perché il subpattern A continua a consumare il testo, a differenza di un vero lookbehind.