正規表現
python3

pythonで否定的先読みというのをつかいたい。

前置き

【否定的先読み】については色々な方のサイトを参考にしたほうが良いと思います。

bcdという文字列が来たときは処理したいけど、
abcdという文字だったら処理したくない!
という感じのときに使うものらしいです。(多分)

サンプルコード

python 3.6.3ですが、他のバージョンでも動くんじゃないかなあ。

main.py
# coding: utf-8

import re
import sys

argvs = sys.argv

print(argvs)

print("argvs[1] : ",argvs[1])
print("type(argvs[1]) : ",type(argvs[1]))


if re.search(r'^(?!.*abcd).*(?=bcd|def).+$' ,argvs[1]):
    print("True")
else:
    print("False")

re.search(r'^(?!.*abcd).*(?=bcd|def).+$' ,argvs[1])
ここの^(?!.*abcd)が、abcdを除外するで、.*(?=bcd|def).+$
bcdとdefを検知するのような形になるみたいです。

実行ログ

ajitama-server$ python main.py "abc"
['main.py', 'abc']
argvs[1] :  abc
type(argvs[1]) :  <class 'str'>
False
ajitama-server$ python main.py "abcd"
['main.py', 'abcd']
argvs[1] :  abcd
type(argvs[1]) :  <class 'str'>
False
ajitama-server$ python main.py "bcd"
['main.py', 'bcd']
argvs[1] :  bcd
type(argvs[1]) :  <class 'str'>
True
ajitama-server$ python main.py "def"
['main.py', 'def']
argvs[1] :  def
type(argvs[1]) :  <class 'str'>
True

re.searchじゃなくてもre.matchを使ったほうがちゃんとできるかもしれませんが、
slackbotの正規表現はどうもmatchではなさそうだったのでこれで対処しました。

賢くないので、わかりにくいっす…。