前回の記事「SlackbotをPythonで作成しよう」にてPythonでSlackbotを実装しました。
前回の記述だと、以下のパターン全てに反応してしまいます。
・こんにちは
・こんにちは!
・やあ、こんにちは
・こんにちはあ
何でもかんでも反応すると煩わしいので以下の条件の元反応するパターンを減らしてみたいと思います。
条件1:「こんにちは」の前に言葉がある場合には反応しない
条件2:以下の3パターンには反応するようにしたい
・こんにちは
・こんにちは!
・こんにちは!!
条件3:「こんにちは0」など数字が続く場合はNGとしたい
条件4:「こんにちは」の後に続くのは2文字まで
PythonでのSlackbot作成の基本については「SlackbotをPythonで作成しよう」をお読みください。
目次
正規表現を使ってSlackbotの応答パターンを制御する
正規表現を使うことで入力文字を制御することができます。
Pythonで正規表現を使う場合は「re」ライブラリが必要ですが「@respond_to/@listen_to」で正規表現の「re.compile()」が動作しているので指定は不要です。
正規表現文字列のパターンを追加する
「こんにちは」、「こんにちは!」、「こんにちは!!」の3パータンのみに反応させる方法です。
以下のように3つ全て記述することで3パターンに対応可能。
1 2 3 4 5 | @respond_to('^こんにちは$') @respond_to('^こんにちは!$') @respond_to('^こんにちは!!$') def greeting_1(message): message.reply('こんにちは!') |
「^こんにちは」は「こんにちは」から始まる文字列を意味します。
「こんにちは$」はこんにちはで終わる文字列です。
知らない言葉には反応しません。
また、今回のように「!」など決まった記号を付けたいだけの場合は以下のように記述もできます。
「?」をつけると直前の文字を省略可能です。
1 2 3 4 | # 「?」をつけることで直前の文字を省略可能にできる @respond_to('^こんにちは!?!?$') def greeting_1(message): message.reply('こんにちは!') |
なお、「?」を使いたい場合は以下のようにエスケープ文字であるバックスラッシュ()を直前に記述します。
@respond_to('^こんにちは??$')
これで、条件1〜条件4を満たせましたが、
・こんにちは
・こんにちはあ
など、条件に反しない範囲でもっといろいろなパターンに反応できるようにしたいと思います。
正規表現の記号を使ってSlackbotの応答するパターンを増やす方法
正規表現を活用してSlackbotの応答パターンを増やす方法について紹介します。
具体的には以下の2点です。
・数字以外の1字を指定する方法
・繰り返し記号を活用してパターンを増やす方法
数字以外の1字を指定する方法
条件2の2パターンに反応しつつ、
・条件1:「こんにちは」の前に言葉がある場合には反応しない
・条件3:「こんにちは0」など数字が続く場合はNGとしたい
・条件4:「こんにちは」の後に続くのは2文字まで
の3つに反しない範囲で拡張していきます。
条件1に関しては「^」から開始しているのでこのままでOKです。
「こんにちは」の直後が数字の場合はNGとして、2文字以下とする場合は以下のように記述します。
1 2 3 | @respond_to('^こんにちはD?D?$') def greeting_1(message): message.reply('こんにちは!') |
「D」は数字以外の文字1字です。上記の場合は「こんにちは」+「数字以外の0〜2文字」です。
繰り返し記号を活用してパターンを増やす方法
「こんにちは」以降何文字でも良い場合は、「D*」と指定することで何文字でもOKとなります。
「*」は0文字以上の文字を意味します。「D*」のように他の特殊文字でセットで使用可能です。
数字も含めてもOKな場合は「S*」(スペース以外の文字)とすることで反応可能となります。
1 2 3 4 5 6 7 8 9 | # 数字以外なら何文字でもOK @respond_to('^こんにちはD*$') def greeting_1(message): message.reply('こんにちは!') # スペース以外はOK @respond_to('^こんにちはS*$') def greeting_1(message): message.reply('こんにちは!') |
「/S」や「*」といった文字は「こんにちは」の前に入れることも可能です。
1 2 3 4 | # 前にも追加可能 @respond_to('^S*こんにちはS*$') def greeting_1(message): message.reply('こんにちは!') |
以上、Slackbotの挨拶パターンの追加でした。
終わりに:いろいろなパターンを試してみよう
今回はSlackbotの応答パターンを増やす方法について紹介しました。
正規表現を活用すれば少ないコードでいろいろなパターンに対応できるようになります。
正規表現には今回紹介した方法以外にも様々なパターンマッチが可能です。
いろいろ試してみてください。
Slackbot導入マニュアル>>Slackbotの作り方マニュアル〜Python編〜