r"\."+".+"+"apple"+".+"+"\."
Linia ta jest nieco dziwny; dlaczego łączą tak wiele oddzielnych łańcuchów? Możesz po prostu użyć r '.. + apple. +.'.
W każdym razie problem z twoją regularną ekspresją to chciwość. Domyślnie x+
będzie pasował do x
tak często, jak tylko możliwe. Tak więc twój .+
będzie pasował tyle znaków (jakikolwiek znaków), jak to możliwe; w tym kropki i apple
s.
Zamiast tego użyjesz nieagresywnego wyrażenia; zazwyczaj można to zrobić, dodając na końcu: ?
: .+?
.
To pozwoli Ci uzyskać następujący wynik:
['.I like to eat apple. Me too.']
Jak widać już nie dostać zarówno przez Apple zdań ale nadal Me too.
. Dzieje się tak, ponieważ wciąż pasujesz do .
po apple
, uniemożliwiając nie uchwycenie również następującego zdania.
Działający wyrażenie regularne będzie to: r'\.[^.]*?apple[^.]*?\.'
Tu nie patrzeć na jakichkolwiek znaków, ale tylko te znaki, które nie są same kropki. Dopuszczalne jest również niedopasowanie żadnych znaków (ponieważ po apple
w pierwszym zdaniu nie ma żadnych znaków spoza kropki). Używając tego wyrażenia Skutkuje to:
['.I like to eat apple.', ". Let's go buy some apples."]
+1 ładna odpowiedź! jeśli utworzysz 'txt = txt * 10000', a następnie'% timeit' wynik będzie bardziej przejrzysty – Kent
Dzięki Kent. Dodałem test porównawczy '% timeit' dla większych ciągów. – unutbu