Extracto de Python frase que contiene la palabra

Estoy tratando de extraer todas las frases que contienen una palabra específica de un texto.

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

pero me está volviendo:

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

en lugar de :

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

¿Alguna ayuda por favor?

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

    No hay necesidad de expresiones regulares:

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

    Pero tenga en cuenta que la solución de @ jamylak basada en la split es más rápida:

     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 

    La diferencia de velocidad es menor, pero aún significativa, para cadenas más grandes:

     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 

    Puedes usar 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."] 
     r"\."+".+"+"apple"+".+"+"\." 

    Esta línea es un poco rara; ¿Por qué concatenar tantas cuerdas separadas? Puedes usar r ‘.. + apple. +.’.

    De todos modos, el problema con tu expresión regular es su codicia. Por defecto, una x+ coincidirá con x tan a menudo como sea posible. Por lo tanto, tu .+ Coincidirá con tantos caracteres ( cualquier carácter) como sea posible; Incluyendo puntos y apple s.

    Lo que quieres usar en cambio es una expresión no codiciosa; usualmente puedes hacer esto agregando un ? al final:. .+? .

    Esto te hará obtener el siguiente resultado:

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

    Como puedes ver, ya no obtienes las dos oraciones de manzana, sino el Me too. . Eso es porque todavía coinciden con el . después de la apple , lo que hace imposible no capturar la siguiente oración también.

    Una expresión regular de trabajo sería esta: r'\.[^.]*?apple[^.]*?\.'

    Aquí no miras a ningún personaje, sino solo a aquellos que no son puntos en sí mismos. También permitimos no hacer coincidir ningún carácter en absoluto (porque después de la apple en la primera oración no hay caracteres sin puntos). Usar esa expresión resulta en esto:

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

    Obviamente, la muestra en cuestión es una extract sentence containing substring lugar de
    extract sentence containing word . La forma de resolver la extract sentence containing word problema extract sentence containing word través de python es la siguiente:

    Una palabra puede estar al principio | medio | final de la oración. No limitado al ejemplo de la pregunta, proporcionaría una función general de buscar una palabra en una oración:

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

    Limitado al ejemplo en la pregunta, podemos resolver como:

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

    La salida correspondiente es:

     ['I like to eat apple']