2012-07-04 10 views
9

Ho un qualcosa di stringa come questaUna regex per rilevare stringa non racchiusa tra virgolette

"quick" "brown" fox jumps "over" "the" lazy dog

ho bisogno di una regex per individuare le parole non racchiuse tra virgolette. Dopo alcuni tentativi casuali ho trovato questo ("([^"]+)"). Questo rileva una stringa racchiusa tra virgolette. Ma io voglio il contrario. Non riesco davvero a inventarlo anche dopo aver tentato di invertire la regex di cui sopra. Sono abbastanza debole in regex. Please help me

+1

è possibile abbinare tutte le stringhe, che ha citato con '" 'e aggiungere' NOT' per questo filtro :) – gaussblurinc

+1

modo che si desidera questo per afferrare 'fox jump lazy dog'? – jared

+1

@jared: si lo stesso – Shades88

risposta

26

Usa lookahead/lookbehind affermazioni:

(?<![\S"])([^"\s]+)(?![\S"]) 

Esempio:

>>> import re 
>>> a='"quick" "brown" fox jumps "over" "the" lazy dog' 
>>> print re.findall('(?<![\S"])([^"\s]+)(?![\S"])',a) 
['fox', 'jumps', 'lazy', 'dog'] 

La cosa principale qui è lookahead/lookbehind affermazioni. Puoi dire: voglio questo simbolo prima dell'espressione ma non voglio che faccia parte della partita stessa. Ok. Per utilizzare affermazioni:

(?<![\S"])abc 

che è un lookbehind negativo . Ciò significa che si desidera abc ma senza [\S"]prima di esso, ciò significa che prima non deve essere presente alcun carattere non spaziale (inizio della parola) o ".

Questo è lo stesso, ma nella direzione opposta:

abc(?![\S"]) 

Questo è un lookahead negativo . Ciò significa che vuoi abc ma senza [\S"]dopo it.

Ci sono quattro affermazioni differenet del tipo in generale:

(?=pattern) 
    is a positive look-ahead assertion 
(?!pattern) 
    is a negative look-ahead assertion 
(?<=pattern) 
    is a positive look-behind assertion 
(?<!pattern) 
    is a negative look-behind assertion 
+1

grazie mille, che ha funzionato come per magia :) Solo un altro favore, puoi spiegarlo un po '? Sembra un po' complesso – Shades88

+1

@ Shades88: no per niente :) –

+1

dai ... conosci il loro tipo come "guarda avanti/guarda dietro affermazioni". puoi sicuramente spiegarmi come funziona !! – Shades88

0

Rimuovere la prima citazione dalla stringa

0

uso questa espressione regolare:

\s+(?<myword>([^\"\s]+)*)\s+ 

questo dovrebbe essere il lavoro; e ottieni il gruppo myword. altrimenti è necessario tagliare la stringa dei risultati.

+0

che non lavoro per parole con un solo spazio tra: 'fox jumps' ad esempio –

Problemi correlati