L’espressione regolare Lookbehind non funziona con i quantificatori (‘+’ o ‘*’)

Sto cercando di usare lookbehinds in un’espressione regolare e non sembra funzionare come mi aspettavo. Quindi, questo non è il mio vero utilizzo, ma per semplificare farò un esempio. Immagina di voler abbinare “esempio” a una stringa che dice “questo è un esempio”. Quindi, secondo la mia comprensione di lookbehinds questo dovrebbe funzionare:

(?<=this\sis\san\s*?)example 

Ciò che questo dovrebbe fare è trovare “questo è un”, quindi i caratteri spaziali e infine abbinare la parola “esempio”. Ora, non funziona e non capisco perché, è imansible usare ‘+’ o ‘*’ all’interno di lookbehinds?

Ho provato anche questi due e funzionano correttamente, ma non soddisfano le mie esigenze:

 (?<=this\sis\san\s)example this\sis\san\s*?example 

Sto usando questo sito per testare le mie espressioni regolari: http://gskinner.com/RegExr/

Molte librerie di espressioni regolari consentono solo l’uso di espressioni rigide in look dietro asserzioni come:

  • abbina solo stringhe della stessa lunghezza fissa: (?<=foo|bar|\s,\s) (tre caratteri ciascuna)
  • abbina solo stringhe di lunghezza fissa: (?<=foobar|\r\n) (ogni ramo con lunghezza fissa)
  • abbina solo stringhe con una lunghezza limite superiore: (?<=\s{,4}) (fino a quattro ripetizioni)

Il motivo di queste limitazioni è principalmente dovuto al fatto che tali librerie non possono elaborare le espressioni regolari al contrario o solo un sottoinsieme limitato.

Un'altra ragione potrebbe essere quella di evitare che gli autori costruiscano espressioni regolari troppo complesse che sono pesanti da elaborare in quanto hanno un cosiddetto comportamento patologico (vedi anche ReDoS ).

Vedi anche la sezione sui limiti delle asserzioni look-behind su Regular-Expressions.info .

Ehi, se non stai usando la variabile python guarda dietro l’asserzione puoi ingannare il motore regex evadendo la corrispondenza e ricominciando usando \K

Questo sito lo spiega bene .. http://www.phpfreaks.com/blog/pcre-regex-spotlight-k ..

Ma praticamente quando hai un’espressione che abbini e vuoi ottenere tutto ciò che c’è dietro usando \ K la costringerai a ricominciare da capo …

Esempio:

 string = ' with some information 
LOOK FOR ME
'

l’abbinamento /(\)\K.+?(?=\ causerà il riavvio della regex dopo aver abbinato il tag div finale in modo che regex non includerà quello nel risultato. Il (?=\div) farà in modo che il motore ottenga tutto davanti al tag div di fine

Ciò che Amber ha detto è vero, ma puoi aggirarlo con un altro approccio: un gruppo di parentesi che non cattura

 (?<=this\sis\san)(?:\s*)example 

Ciò lo rende un aspetto di lunghezza fissa dietro, quindi dovrebbe funzionare.

La maggior parte dei motori regex non supporta espressioni di lunghezza variabile per le asserzioni lookbehind.

Puoi usare le sotto-espressioni.

 (this\sis\san\s*?)(example) 

Quindi, per recuperare il gruppo 2, “esempio”, $2 per regex, o \2 se stai usando una stringa di formato (come per re.sub di python)