2013-04-16 13 views
7

Próbuję wyodrębnić wszystkie zdania zawierające określone słowo z tekstu.Wyrok wypakowany zdanie zawierające słowo

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

ale to wraca do mnie:

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

zamiast:

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

Każda pomoc proszę?

Odpowiedz

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

Można użyć 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"] 

Należy jednak pamiętać, że to @ jamylak split rozwiązanie -na jest szybsze:

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 

Różnica prędkości jest mniej, ale nadal znaczące, aby powiększyć ciągi:

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 ładna odpowiedź! jeśli utworzysz 'txt = txt * 10000', a następnie'% timeit' wynik będzie bardziej przejrzysty – Kent

+0

Dzięki Kent. Dodałem test porównawczy '% timeit' dla większych ciągów. – unutbu

16

Nie potrzeba 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."] 
+0

dziękuję jamylak – user2187202

+0

@ user2187202 Możesz zaakceptować moją odpowiedź, jeśli chcesz lub zaakceptować rozwiązanie do wyrażenia regularnego, jeśli było to w rzeczywistości potrzebne, ponieważ oznaczyłeś je jako pytanie regex, nie jestem pewien, czy to było istotne czy nie, – jamylak

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

Oczywiście próbka w pytaniu extract sentence containing substring zamiast
extract sentence containing word.Jak rozwiązać problem extract sentence containing word przez pythona jest następująca:

Słowo może być na początku | środku | Koniec zdania. Nie ogranicza się do przykładu w pytaniu, chciałbym zapewnić ogólną funkcję przeszukiwania wyraz w zdaniu:

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

ograniczony do przykładu w pytaniu, możemy rozwiązać następująco:

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

Odpowiednia moc wyjściowa to:

['I like to eat apple'] 
Powiązane problemy