Sto tentando di eliminare alcune cose da un blocco di testo utilizzando espressioni regolari. Ho tutti i miei schemi pronti, ma non riesco a essere in grado di rimuovere due (o più) che si sovrappongono.Combinazione di sostituzioni multiple di espressioni regolari
Ad esempio:
import re
r1 = r'I am'
r2 = r'am foo'
text = 'I am foo'
re.sub(r1, '', text) # Returns ' foo'
re.sub(r2, '', text) # Returns 'I '
Come faccio a sostituire entrambe le occorrenze contemporaneamente e finiscono con una stringa vuota?
ho finito per usare una versione leggermente modificata di Ned Batchelder's answer:
def clean(self, text):
mask = bytearray(len(text))
for pattern in patterns:
for match in re.finditer(pattern, text):
r = range(match.start(), match.end())
mask[r] = 'x' * len(r)
return ''.join(character for character, bit in zip(text, mask) if not bit)
Non ho mai pensato agli attributi 'start' e' end' per gli oggetti match. Sono più che sicuro che funzionerà, quindi grazie! – Blender
Ottima risposta! Ho aggiunto '()' a 'start' e' end', perché questi sono metodi, non attributi. – georg
@ thg435: grazie, avrei dovuto provarlo! :) –