r"\."+".+"+"apple"+".+"+"\."
Diese Linie ein wenig seltsam ist; Warum verketten Sie so viele getrennte Strings? Du könntest einfach r '.. + apple. +.'
Wie auch immer, das Problem mit Ihrem regulären Ausdruck ist seine Greedy-Ness. Standardmäßig wird x+
so oft wie möglich mit x
übereinstimmen. So wird Ihre .+
so viele Zeichen (alle Zeichen) wie möglich übereinstimmen; einschließlich Punkte und apple
s.
Was Sie stattdessen verwenden möchten, ist ein nicht gieriger Ausdruck; Sie können dies normalerweise tun, indem Sie am Ende eine ?
hinzufügen: .+?
.
Dies wird Ihnen das folgende Ergebnis erhalten zu lassen:
['.I like to eat apple. Me too.']
Wie Sie Sie nicht mehr sowohl die Apfel-Sätze erhalten sehen, aber immer noch die Me too.
. Das liegt daran, dass Sie immer noch die .
nach der apple
übereinstimmen, was es unmöglich macht, auch den folgenden Satz nicht zu erfassen.
Ein Arbeits regulärer Ausdruck wäre dies: r'\.[^.]*?apple[^.]*?\.'
Hier können Sie sehen nicht auf jedes Zeichen, sondern nur jene Zeichen, die selbst keine Punkte. Wir erlauben auch keine Übereinstimmung mit irgendwelchen Zeichen (denn nach dem apple
im ersten Satz gibt es keine nicht-Punkt-Zeichen). dass die Expression unter Verwendung ergibt dies:
['.I like to eat apple.', ". Let's go buy some apples."]
+1 nette Antwort! Wenn Sie ein 'txt = txt * 10000' machen, dann wäre'% timeit' das Ergebnis klarer – Kent
Danke Kent. Ich habe einen '% Zeit'-Benchmark für größere Saiten hinzugefügt. – unutbu