r"\."+".+"+"apple"+".+"+"\."
Questa linea è un po 'strano; perché concatenare così tante stringhe separate? Potresti semplicemente usare r '.. + apple. +.'.
In ogni caso, il problema con la tua espressione regolare è la sua avidità. Per impostazione predefinita, x+
corrisponderà a x
tutte le volte che è possibile. Quindi il tuo .+
corrisponderà al maggior numero possibile di caratteri (qualsiasi caratteri); compresi i punti e apple
s.
Quello che si desidera utilizzare è un'espressione non-golosa; in genere è possibile farlo aggiungendo un ?
alla fine: .+?
.
Questo vi farà ottenere il seguente risultato:
['.I like to eat apple. Me too.']
Come si può vedere che si ottiene non è più sia l'Apple-frasi, ma ancora il Me too.
. Questo perché si abbina ancora allo .
dopo lo apple
, rendendo impossibile non acquisire anche la seguente frase.
Un lavoro espressione regolare sarebbe questo: r'\.[^.]*?apple[^.]*?\.'
Qui non si guarda in qualsiasi personaggi, ma solo i caratteri che non sono essi stessi puntini. Permettiamo anche di non abbinare nessun carattere (perché dopo lo apple
nella prima frase non ci sono caratteri senza punti). Utilizzando tale espressione si traduce in questo:
['.I like to eat apple.', ". Let's go buy some apples."]
+1 bella risposta! se fai un 'txt = txt * 10000' quindi'% timeit' il risultato sarebbe più chiaro – Kent
Grazie Kent. Ho aggiunto un benchmark '% timeit' per stringhe più grandi. – unutbu