web-dev-qa-db-ja.com

Python単語を含む文を抽出する

指定された単語を含むすべての文をテキストから抽出しようとしています。

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

何か助けてください?

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

正規表現の必要はありません:

>>> 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."]
21
jamylak
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
9
unutbu

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."]
4
Adem Öztaş
r"\."+".+"+"Apple"+".+"+"\."

この行は少し奇妙です。なぜこれほど多くの個別の文字列を連結するのですか? r '.. + Apple。+。'を使用できます。

とにかく、正規表現の問題はその貪欲さです。デフォルトでは、x+は可能な限り頻繁にxと一致します。したがって、.+はできるだけ多くの文字(any文字)に一致します。ドットとApplesを含みます。

代わりに使用したいのは、欲張りでない表現です。通常、これを行うには、最後に?を追加します:.+?

これにより、次の結果が得られます。

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

ご覧のとおり、Appleの文は両方とも取得されていませんが、Me too.は取得されています。これは、Appleの後に.が一致しているため、次の文もキャプチャしないことが不可能であるためです。

有効な正規表現は次のようになります:r'\.[^.]*?apple[^.]*?\.'

ここでは、any文字ではなく、ドット自体ではない文字のみを確認します。また、文字をまったく一致させないことも許可します(最初の文のAppleの後にドット以外の文字がないため)。その式を使用すると、次のようになります。

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

明らかに、問題のサンプルはextract sentence containing substringではなく
extract sentence containing Word。 python)を介してextract sentence containing Word問題を解決する方法は次のとおりです。

単語は文の最初|中間|最後に置くことができます。質問の例に限らず、文中の単語を検索する一般的な機能を提供します。

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']
0
YJ. Yang