r"\."+".+"+"apple"+".+"+"\."
Эта линия является немного странным; зачем сжимать так много отдельных строк? Вы могли бы просто использовать r '.. + apple. +.'.
В любом случае проблема с вашим регулярным выражением - это его жадность. По умолчанию x+
будет соответствовать x
настолько часто, насколько это возможно. Таким образом, ваш .+
будет соответствовать как можно большему количеству символов (любых символов); включая точки и apple
с.
То, что вы хотите использовать вместо этого, является неживым выражением; вы можете сделать это, добавив ?
в конце: .+?
.
Это позволит вам получить следующий результат:
['.I like to eat apple. Me too.']
Как вы можете видеть, что Вы больше не получите как яблочные-предложения, но до сих пор в Me too.
. Это связано с тем, что вы по-прежнему соответствуют .
после apple
, что делает невозможным не захватить следующее предложение.
Работающий регулярное выражение будет таким: r'\.[^.]*?apple[^.]*?\.'
Здесь вы не смотрите на любых символов, но только те символы, которые не являются многоточий сами. Мы также разрешаем не сопоставлять любые символы вообще (потому что после apple
в первом предложении нет неточечных символов). Используя это выражение результатов в этом:
['.I like to eat apple.', ". Let's go buy some apples."]
+1 хороший ответ! если вы сделаете 'txt = txt * 10000', тогда'% timeit', результат будет более ясным. – Kent
Thanks Kent. Я добавил тест% timeit для больших строк. – unutbu