↓もし、良かったらSNSでの紹介よろしくお願いします。

【Python】上手に文字列が含まれているかを判定する

bootstrap

findメソッドを利用する方法

ある文字列が含まれているかの判定にfindメソッドが利用できます。

検索した文字が含まれていないときは-1を返すのでそれを利用して判定します。

>>>s = 'yamada taro'
>>>0 <= s.find('yamada')
True
>>>0 <= s.find('taro')
True
>>>0 <= s.find('hanako')
False

含まれているかの判定は実はinを使うのがおススメ

findで文字列が含むかの判定を行う手法は
ほかの言語でもよく利用するほうほうなので有名です。

しかし、Pythonでは、in キーワードを使うほうがおススメです。

>>>'Taro' in 'Yamada Taro'
True
>>>'Hanako' in 'Yamada Taro'
False
>>>0<='Yamada Taro'.find("Taro")#冗長
True

if文の条件式などでfindを使うと冗長に見えてしまいます。

イコールをつけ忘れなどで、バグの原因にもなります。

なので、文字列が含まれているかの判定では、
findではなく、inを利用することをオススメします。

大文字、小文字を区別せずに含まれているかの判定

大文字、小文字を区別せずに文字列を含むかの判定を行いたいときがあります。

このような場合、
すべて小文字か大文字かに揃えて判定を行うと良いです。

>>>s = "My name is Taro."
>>>w = "taro"
>>>"taro" in s#Taroとtaroがマッチしない
False
>>>w.lower() in s.lower()#小文字にそろえる
True
>>>w.upper() in s.upper()#大文字にそろえる
True

あるパターンが含まれているかの判定

さらに高度な判定方法が必要な場合は、正規表現を利用しましょう。

正規表現とは?

「4桁の数字」、「アルファベットの文字列」もしくは「郵便番号」などのある特定のパターンにマッチする文字列を抜き出したいというケースがあると思います。

そのようなときは、これらのパターンを正規表現という方法で表すことで文字列を含むかの判定が行えます。

たとえば、「4けたの数字」を正規表現であらわすと"\d\d\d\d"または、"\d{4}"となります。

このように正規表現を利用することで検索範囲を広げることができます

Pythonで正規表現を利用する

Pythonで正規表現を使うには標準ライブラリreをimportします。

標準ライブラリなのでインストールは不要です。

matchメソッドで判定を行う

正規表現で検索パターンが含まれいるかの判定を行う場合matchメソッドを利用します。

次のコードでは、電話番号のパターンを検索しています。

>>>if re.match('\d+-\d{4}-\d{4}', '11-2222-6666'):
...     print("OK")
... else:
...     print("NG")
...
OK
>>>if re.match('\d+-\d{4}-\d{4}', '11-aaaa-6666'):
...     print("OK")
... else:
...     print("NG")
...
NG

完全一致は$(ドルマーク)を利用する。

上記のコードだと前方一致で検出が行われます。

しかし、完全一致を検出したい時があります。

そんなときは、文末を表す正規表現$(ドルマーク)を利用しましょう。

次の正規表現で郵便番号の簡易判定を行います。

>>>if re.match('\d{3}-\d{4}$', '11-2222-6666'):
...     print("OK")
... else:
...     print("NG")
...
NG
>>>if re.match('\d{3}-\d{4}', '112-0234'):
...     print("OK")
... else:
...     print("NG")
...
OK