2013-03-15 26 views
6

Sto cercando di abbinare e rimuovere tutte le parole in una lista da una stringa utilizzando una regex compilata, ma sto cercando di evitare le occorrenze all'interno delle parole.Rimuovi tutte le occorrenze di parole in una stringa da un elenco python

attuale:

REMOVE_LIST = ["a", "an", "as", "at", ...] 

remove = '|'.join(REMOVE_LIST) 
regex = re.compile(r'('+remove+')', flags=re.IGNORECASE) 
out = regex.sub("", text) 

In: "The quick brown fox saltato su una formica"

Out: "quick brown fox saltato t"

attesi: "la volpe marrone veloce è saltata"

Ho provato a cambiare la stringa di compilare il seguente, ma senza alcun risultato:

regex = re.compile(r'\b('+remove+')\b', flags=re.IGNORECASE) 

qualsiasi suggerimento o mi sto perdendo qualcosa vistosamente ovvio?

+0

Presumibilmente 'ant' fa parte della vostra rimuovere la lista? –

risposta

8

Un problema è che solo il primo \b si trova all'interno di una stringa non elaborata. Il secondo viene interpretato come carattere backspace (ASCII 8) anziché come limite di parola.

Per fissare, modificare

regex = re.compile(r'\b('+remove+')\b', flags=re.IGNORECASE) 

a

regex = re.compile(r'\b('+remove+r')\b', flags=re.IGNORECASE) 
           ^THIS 
+1

Come trucco per scoprirlo (oltre a sapere in anticipo), invia il pattern con 'regex.pattern' – nhahtdh

+0

Nice one NPE. Grazie! – Ogre

16

ecco un suggerimento senza l'utilizzo di espressioni regolari che si può prendere in considerazione:

>>> sentence = 'word1 word2 word3 word1 word2 word4' 
>>> remove_list = ['word1', 'word2'] 
>>> word_list = sentence.split() 
>>> ' '.join([i for i in word_list if i not in remove_list]) 
'word3 word4' 
+0

Groovy. Non ci avevo pensato. Grazie :) – Ogre

+0

Vale la pena sottolineare che questo avrà difficoltà con la punteggiatura e non conserverà le schede/gli spazi bianchi consecutivi (non è sicuro che quest'ultimo sia importante). – NPE

+3

Vale la pena notare che se 'remove_list' è grande, si dovrebbe fare meglio con' remove_set = {'word1', 'word2', ...} 'poiché le serie hanno test di appartenenza molto più rapidi. –

Problemi correlati