slackbot備忘録 ~正規表現を使ったリクエスト編~


はじめに

pythonを使ってslackbotを作成した備忘録パート3

前回から、だいぶ時間がたってしまった…

皆さん、よくこんなサンプル見ませんか?

@respond_to("^test\s+\S.*")

私は最初、「こういうものなんだ!」と何も考えずに使っていた

しかし、よくよく考えると()内は正規表現だと気づいた(遅い)

ということで「こんな respond_to 作りたいなぁ」という悩みがあったので、正規表現で解決してみた!

今回はその正規表現をまとめてみた

お品書きは以下の通り

  • そもそも正規表現って何?
  • よく使う正規表現
  • 「文頭(文末)の文字に反応してほしいなぁ」
  • 「test 〇〇みたいにコマンド形式に反応してほしいなぁ」
  • 「複数の言葉でも、1回だけ処理を実行してほしいなぁ」
  • 「複数部、可変的にとりたいなぁ」
  • おわりに

そもそも正規表現って何?

正規表現とは、「文字列の集合を一つの文字列で表現する方法の一つ」である

PHP, Perl, Python, Ruby などで使用することができる

Python には正規表現を使用した検索や置換などの操作を行うライブラリ(re)がある
しかし、今回は使用しないため、説明は省く

もしよかったら私がまとめた正規表現も見てやってください|д゚)

よく使う正規表現

「文頭や文末の文字に反応してほしいなぁ」

@respond_to("^おはよう")  # 文頭
@respond_to("こんばんは。$")  # 文末
def respond_func(message):
    message.react("+1")

文頭には ^, 文末には $ を使用する
しっかりと対応しているのがわかりますね!

@respond_to("^こんにちは$"):
def respond_func(message):
    mes = message.body["text"]
    message.send(mes)

二つを組み合わせると、「完全一致」の正規表現となる
「こんにちは」という言葉にしか反応しませんね!

「test 〇〇みたいにコマンド形式に反応してほしいなぁ」


@listen_to("^repeat\s+\S.*")
def repeat_func(message):
    rep_str = message.body["text"][7:]
    message.send(rep_str)

みんなが大好きな正規表現

\s+ スペース(タブ)が1文字以上
\S スペース(タブ)以外が1文字
.* 任意の文字が0文字以上

となっている
\S がないとスペース(タブ)が1文字だけでも反応してしまうので注意


このようにコマンドラインのようにボットを動かすこともできる!

「複数の言葉でも、1回だけ処理を実行してほしいなぁ」

私は、最初にこれを思いつきました
* 良くない例

@listen_to("いいね")
@listen_to("グッド")
@listen_to("good")
def reaction_func(message):
    message.react("+1")

これの良くない点は「いいね!グッド!good!」みたいに入力すると三回動いてしまうのです

もちろん同じリアクションを一人で何個も付けることができないので、エラーalready_reactedを吐く

正規表現を使用すれば、難なくクリアできる!

  • 良い例
@listen_to("いいね|グッド|good")
def reaction_func(message):
    message.react("+1")

| は正規表現で「or」の意味でしたね( ˘ω˘ )

このようにエラーを吐くことなく処理を完了しました!

「複数部、可変的にとりたいなぁ」

現在、謎のエラーが大量セールのため調査中です… <(_ _ >)

おわりに

正規表現は抱えていた悩みをたくさん吹き飛ばしてくれた!
最近は、slackbot上だけでなく業務でも正規表現を多用するようになった

はやく正規表現マスターになりたいなぁと思う今日この頃でした…!