前置き
【否定的先読み】については色々な方のサイトを参考にしたほうが良いと思います。
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ではなさそうだったのでこれで対処しました。
賢くないので、わかりにくいっす…。