2013-04-16 4 views
7

Я пытаюсь извлечь все предложение, содержащее указанное слово из текста.Python extract предложение, содержащее слово

txt="I like to eat apple. Me too. Let's go buy some apples." 
txt = "." + txt 
re.findall(r"\."+".+"+"apple"+".+"+"\.", txt) 

, но она возвращается меня:

[".I like to eat apple. Me too. Let's go buy some apples."] 

вместо:

[".I like to eat apple., "Let's go buy some apples."] 

Любая помощь, пожалуйста?

ответ

9
In [3]: re.findall(r"([^.]*?apple[^.]*\.)",txt)                                
Out[4]: ['I like to eat apple.', " Let's go buy some apples."] 
3

Вы можете использовать str.split,

>>> txt="I like to eat apple. Me too. Let's go buy some apples." 
>>> txt.split('. ') 
['I like to eat apple', 'Me too', "Let's go buy some apples."] 

>>> [ t for t in txt.split('. ') if 'apple' in t] 
['I like to eat apple', "Let's go buy some apples."] 
7
In [7]: import re 

In [8]: txt=".I like to eat apple. Me too. Let's go buy some apples." 

In [9]: re.findall(r'([^.]*apple[^.]*)', txt) 
Out[9]: ['I like to eat apple', " Let's go buy some apples"] 

Но обратите внимание, что @ jamylak-х split основанное решение быстрее:

In [10]: %timeit re.findall(r'([^.]*apple[^.]*)', txt) 
1000000 loops, best of 3: 1.96 us per loop 

In [11]: %timeit [s+ '.' for s in txt.split('.') if 'apple' in s] 
1000000 loops, best of 3: 819 ns per loop 

Разница в скорости меньше, но по-прежнему значительны, для увеличения строки:

In [24]: txt = txt*10000 

In [25]: %timeit re.findall(r'([^.]*apple[^.]*)', txt) 
100 loops, best of 3: 8.49 ms per loop 

In [26]: %timeit [s+'.' for s in txt.split('.') if 'apple' in s] 
100 loops, best of 3: 6.35 ms per loop 
не
+0

+1 хороший ответ! если вы сделаете 'txt = txt * 10000', тогда'% timeit', результат будет более ясным. – Kent

+0

Thanks Kent. Я добавил тест% timeit для больших строк. – unutbu

16

Нет необходимости в регулярных выражениях:

>>> txt = "I like to eat apple. Me too. Let's go buy some apples." 
>>> [sentence + '.' for sentence in txt.split('.') if 'apple' in sentence] 
['I like to eat apple.', " Let's go buy some apples."] 
+0

Спасибо jamylak – user2187202

+0

@ user2187202 Вы можете принять мой ответ, если хотите или принять решение регулярного выражения, если это действительно то, что вам нужно, так как вы пометили его как вопрос с регулярным выражением, я не уверен, что это было важно или нет. – jamylak

2
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."] 
0

Очевидно, что образец в вопросе extract sentence containing substring вместо
extract sentence containing word.Как решить проблему extract sentence containing word через python выглядит следующим образом:

Слово может быть в начале | в середине предложения. Не ограничивается примером в этом вопросе, я бы обеспечить общую функцию поиска слова в предложении:

def searchWordinSentence(word,sentence): 
    pattern = re.compile(' '+word+' |^'+word+' | '+word+' $') 
    if re.search(pattern,sentence): 
     return True 

ограничено, например, в вопросе, мы можем решить, как:

txt="I like to eat apple. Me too. Let's go buy some apples." 
word = "apple" 
print [ t for t in txt.split('. ') if searchWordofSentence(word,t)] 

Соответствующий выход:

['I like to eat apple'] 
Смежные вопросы