ユニオン演算子|
を使用して、検索する必要があるすべての単語を検索します。
In [20]: re_pattern = r'\b(?:total|staff)\b'
In [21]: re.findall(re_pattern, question)
Out[21]: ['total', 'staff']
これは、上記の例に最もよく一致します。ただし、このアプローチは、単語の先頭または末尾に追加された他の文字がない場合にのみ機能します。これは主文節と従属文節の最後によく見られ、コンマ、ドット、感嘆符、または疑問符が文節の最後の単語に追加されます。
例えば、あなたのスタッフは何人ですか?上記のアプローチでは、 staff の末尾に単語境界がないため、staff という単語が見つかりません。代わりに、疑問符があります。しかし、上記の正規表現の最後の 2 番目を省略すると、式は部分文字列内の単語 ( total in total や totalitiesなど)を誤って検出します。\b
目的を達成するための最良の方法は、最初に文内のすべての英数字を抽出してから、次のリストを検索して必要な単語を見つけることです。
In [51]: def find_all_words(words, sentence):
....: all_words = re.findall(r'\w+', sentence)
....: words_found = []
....: for word in words:
....: if word in all_words:
....: words_found.append(word)
....: return words_found
In [52]: print find_all_words(['total', 'staff'], 'The total number of staff in 30?')
['total', 'staff']
In [53]: print find_all_words(['total', 'staff'], 'My staff is totally overworked.')
['staff']