指定された単語を含むすべての文をテキストから抽出しようとしています。
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."]
何か助けてください?
In [3]: re.findall(r"([^.]*?apple[^.]*\.)",txt)
Out[4]: ['I like to eat Apple.', " Let's go buy some apples."]
正規表現の必要はありません:
>>> 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"]
ただし、@ 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
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"+".+"+"\."
この行は少し奇妙です。なぜこれほど多くの個別の文字列を連結するのですか? r '.. + Apple。+。'を使用できます。
とにかく、正規表現の問題はその貪欲さです。デフォルトでは、x+
は可能な限り頻繁にx
と一致します。したがって、.+
はできるだけ多くの文字(any文字)に一致します。ドットとApple
sを含みます。
代わりに使用したいのは、欲張りでない表現です。通常、これを行うには、最後に?
を追加します:.+?
。
これにより、次の結果が得られます。
['.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."]
明らかに、問題のサンプルは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']