Python 指定の単語を含む文章を抽出する関数


目次

1,内容
2,コード
3,終わりに

内容

ある文章から指定の単語を含む文章をヌキ出したく、悶々としていた夏の思ひで。
オッサンになりレベルアップした結果、遂に完全体になりました。
まあ、とりあえずコード実行してミソ。

コード

関数
import re
def extract_sentence_by_match_word(base_sentence, match_word, stop_signs):
    # 指定の単語以前をstop_signsまで抽出する
    get_back_sentence = re.search(f"(.*)(?={match_word})(.*?)({stop_signs})", base_sentence).group()

    # 抜き出した単語を逆順にする
    rev_sentence = get_back_sentence[::-1]

    # 逆順にし、stop_signsから次のstop_signsまで抽出する
    get_rev_sentence = re.search(f"({stop_signs})(.*?)({stop_signs})", rev_sentence).group()

    # もう一度逆順にし、base_sentenceから除外したい文章を抽出する
    extract_words = get_rev_sentence[::-1]
    return extract_words

コード動かすと結構理解しやすい(図解とかゲロ面倒だからやらぬぅ)

サンプルコード

サンプルコード
## 対象の文章
base_sentence = """
オートアート

77425 1/18 西部警察 「マシンRS-1」 放送開始40周年記念モデル 
画像はメーカーの見本です。
(2019年 12月以降発売・入荷日が分かり次第、ご連絡させて頂きます。) 
(発売日が延期となる場合がございます。発売日が延期となった場合は、連絡掲示板でご連絡させて頂きます。) 
(落札後1週間以内にオーダーフォーム入力して下さい。)
(落札後1週間以内にオーダーフォーム入力が無い場合は落札者都合での取消となります。)
(お支払い方法ですが、Yahoo!かんたん決済かジャパンネット銀行でのお支払いの場合は、落札後1週間以内にお支払い下さい。) 
(予約商品となります。落札後キャンセル対応はできませんので、あらかじめご了承下さい。) 


 1979年10月の第一作テレビシリーズ放送開始から数えて2019年でちょうど40年、今なお絶大な人気を誇るアクション刑事ドラマ「西部警察」。劇中に登場したスーパー・パトカー「RS軍団」は、当時の最強モデル「日産 スカイライン(DR30)」をベースに最高時速250km/hオーバーにまで改造され、ドラマでの重要な役割を果たしその人気を支えました。今回多くのご要望にお応えし、オートアートの1/18スケールモデルとして2014年に発売後即完売となった「RS軍団」最速の『マシンRS-1』が約5年ぶりに登場。再モデル化にあたっては、新品番とし、再度入念な資料検証を行いモデル各部を改良、内外装のスペシャルパーツもよりリアルに再現しました。フル開閉モデルならではのギミックも存分にお楽しみ頂けます。さらに放送開始40周年を記念し、ディスプレイケース(別売)の台座に貼付したり、モデルと一緒に展示するとスペシャル感がアップする金属製の『40周年記念プレート』が付属します。 ●開閉式二連装20ミリ機銃●急加速装置アフターバーナー●ルーフ大型警光灯●メッシュホイール●エアアウトレット●エアロパーツ●フロントフォグランプ&赤色灯●助手席大型コンピューター●特殊無線機●ドライバーズシート●ステアリングホイール●「放送開始40周年記念プレート」(金属製・約10×2㎝)付属 ※この商品は日本限定発売モデルです。 石原プロモーション

定価¥24800(税抜)
"""

## 指定の単語
match_words = [
    "年",
    "税抜",
    "限定",
    "¥",
    "定価",
    "支払"
]

## 文章を区切る記号
stop_signs = [
    "【",
    " ",
    "。",
    ".$",
    "^.",
    "\n"
]
stop_signs = "|".join(stop_signs)
print("*" * 100)
print(base_sentence)
print("*" * 100)
for match_word in match_words:
    print()
    print("*" * 100)
    print(f"関連の単語 : {match_word}")
    print("抽出した文章 : ")
    print(extract_sentence_by_match_word(base_sentence, match_word, stop_signs))
    print("*" * 100)

とりあえず動かすのだ ファファファファ

大元の文章

色々こねくり回して、指定の単語を含む文章を取得


上記はわかりやすくするため、match_wordを★に変えて表示させてます。
今回で言うと【年】というのがmatch_wordであり、その単語の前後の文章をヌキ出します。
プロなら一発で指定の単語の前後をヌキ出せるんでしょうが、
イナカモンのワイにはわからんかったので、文章をひっくり返し、
開始stop_signsから次のstop_signsまで取得しました。

そして、その後逆順にすると正常な文章が返ってきて、一件落着となります。

終わりに

全然エラー対策等はしてないが、一旦終了。
これで様々な文章を抽出および削除等が可能になったのが嬉しいし、
初めて汎用性のある関数を作れた気がするし、データ分析官のお役に立てればなにより。

参考サイト
http://straylight-engineer.blogspot.com/2014/01/blog-post.html
https://note.nkmk.me/python-re-match-search-findall-etc/