2013-04-16 22 views
7

Metinden belirli bir sözcük içeren tüm tümceyi ayıklamaya çalışıyorum.Python cümlesi cümlesi içeren kelime

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

ama beni döndürüyor:

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

yerine:

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

Herhangi yardım lütfen?

cevap

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

Sen str.split kullanabilirsiniz

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

Ama @ jamylak en split tabanlı çözüm daha hızlı olduğuna dikkat:

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 

hız farkı daha büyük için daha az, ama yine de önemlidir dizeleri:

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 
regex için
+0

+1 güzel cevap! 'txt = txt * 10000' sonra'% timeit' yaparsanız sonuç daha net olur – Kent

+0

Teşekkür Kent. Daha büyük dizeler için bir '% timeit' ölçütü ekledim. – unutbu

16

gerek yok: Bu satır biraz garip

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

Teşekkür ederiz jamylak – user2187202

+0

@ user2187202 Eğer regex bir soru olarak etiketlemiş olduğunuzdan beri ihtiyacınız olan şey buysa regex çözümünü kabul ederseniz veya kabul ederseniz cevabımı kabul edebilirsiniz, bunun gerekli olup olmadığından emin değilim. – jamylak

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

; Neden bu kadar çok ayrı dizeyi birleştirmek? Sadece r '.. kullanabilirsiniz + elma. +. Her neyse, normal ifadenizdeki sorun açgözlülüktür. Varsayılan olarak x+, x ile eşleşebileceği sıklıkta eşleşir. Yani .+, olabildiğince çok sayıda karakterle (herhangi bir karakter) eşleşecektir; noktalar ve apple s dahil olmak üzere.

Onun yerine kullanmak istediğiniz, açgözlü olmayan bir ifadedir; Bunu genellikle ? sonuna ekleyerek yapabilirsiniz: .+?.

Bu aşağıdaki sonucu elde yapacaktır:

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

sen artık elma cümleler ama yine Me too. hem olsun görebileceğiniz gibi. Bunun nedeni,'dan sonra hala .'u eşleştirmenizdir, bu da aşağıdaki cümleyi yakalamamanın imkansız olmasını sağlar.

Bir çalışma düzenli ifade bu olacaktır: r'\.[^.]*?apple[^.]*?\.' İşte

Eğer herhangi karakterden bakma ama değil sadece bu karakterler kendilerini noktalarken. Ayrıca herhangi bir karakterle eşleşmemesine de izin veriyoruz (çünkü ilk cümlede apple'dan sonra nokta olmayan karakterler yoktur). O ifadeyi kullanarak bu sonuçları:

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

Açıkçası, söz konusu numune extract sentence containing substring yerine extract sentence containing word
olduğunu.

Python ile extract sentence containing word sorununu nasıl çözebilirim ?: Bir kelime, başlığın başına | orta | ucunda olabilir. Söz konusu örnekle sınırlı değil, bir cümlede bir kelime arama genel bir işlev temin edebileceğine:

Söz konusu örneğe sınırlı
def searchWordinSentence(word,sentence): 
    pattern = re.compile(' '+word+' |^'+word+' | '+word+' $') 
    if re.search(pattern,sentence): 
     return True 

biz çözebiliriz gibi:

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

İlgili çıktı:

['I like to eat apple'] 
İlgili konular