Python extract sentence containing word

百般思念 提交于 2019-11-27 17:47:16

问题


I am trying to extract all the sentence containing a specified word from a text.

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

but it is returning me :

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

instead of :

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

Any help please ?


回答1:


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



回答2:


No need for regex:

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



回答3:


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"]

But note that @jamylak's split-based solution is faster:

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

The speed difference is less, but still significant, for larger strings:

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



回答4:


You can use 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."]



回答5:


r"\."+".+"+"apple"+".+"+"\."

This line is a bit odd; why concatenate so many separate strings? You could just use r'..+apple.+.'.

Anyway, the problem with your regular expression is its greedy-ness. By default a x+ will match x as often as it possibly can. So your .+ will match as many characters (any characters) as possible; including dots and apples.

What you want to use instead is a non-greedy expression; you can usually do this by adding a ? at the end: .+?.

This will make you get the following result:

['.I like to eat apple. Me too.']

As you can see you no longer get both the apple-sentences but still the Me too.. That is because you still match the . after the apple, making it impossible to not capture the following sentence as well.

A working regular expression would be this: r'\.[^.]*?apple[^.]*?\.'

Here you don’t look at any characters, but only those characters which are not dots themselves. We also allow not to match any characters at all (because after the apple in the first sentence there are no non-dot characters). Using that expression results in this:

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



回答6:


Obviously, the sample in question is extract sentence containing substring instead of
extract sentence containing word. How to solve the extract sentence containing word problem through python is as follows:

A word can be in the begining|middle|end of the sentence. Not limited to the example in the question, I would provide a general function of searching a word in a sentence:

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

limited to the example in the question, we can solve like:

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)]

The corresponding output is:

['I like to eat apple']


来源:https://stackoverflow.com/questions/16032832/python-extract-sentence-containing-word

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!