- 更新日: 2019年8月6日
- 公開日: 2018年6月27日
【Python入門】文字列比較(等価)のやり方とは?
Pythonに限らず、プログラムを構成する上で欠かせない文字や数値の比較処理。
今回は、Pythonプログラムでよく登場する「等価」についてご紹介します。
参考書などではこのようなセクションを設けていないと思いますので、プログラミング初心者の方にとっては参考になると思いますよ。
【Python入門】文字列比較(等価)のやり方とは?
文字列や値を比較する前に、まずその必要性を改めて確認してみます。
文字列の比較が行われるケース
- データの照合
- 条件分岐
- データ加工
「データの照合」は、ログイン画面をイメージしていただくと分かりやすいと思います。 予め登録されているデータと入力データが正しければ True(真) で次のプロセスに、間違っていれば False(偽) で次のプロセスに進めない。馴染みのある工程なのでイメージしやすいと思います。
次の「条件分岐」は、プログラムを構成する上でよく登場してくる処理。 例えば、「A と B の値(文字)が一致したら C の工程に、一致しなかったら D の工程に」という具合です。 if文と一緒によく使われますね。
最後のデータ加工は、特定の文字(数値)を含むデータファイルを検出して、その文字を違う文字(数値)に置き換えたり、自分の欲しい情報がリリースされたらメール配信するなどアプリケーション要素を含むケースです。
このように文字列の比較は、単純な工程であるにも関わらず様々な場面で活用。もちろん人工知能やデータ解析などでも登場してきますね。 それでは文字列や数値の比較の基礎である「等価」についてコードを交えて、ご紹介していきたいと思います。
文字列の比較方法【基礎編】
こちらではシンプルな例を元に、比較(等価)について馴染んでいけたらと思います。等価処理には、以下の演算子が使用可能。
- ==
- in
==
は等価演算子で、 in
は for文などで登場する演算子。
まずは等価演算子から。
a = 'おおしま'
b = 'OSHIMA'
c = 'おおしま'
print(a == b)
print(a == c)
<< 結果 >>
次に in
を使った等価のコード。
s = "This place is safe."
'safe' in s
<< 結果 >>
このあたりはPythonの基礎学習を終えている方にとっては、簡単なプログラムなので特に説明も必要ないですね。
文字列の比較方法【中級編】
初級編では単純に文字や数値の等価を行いました。次は、Pythonのオブジェクト指向などで登場するオブジェクトの等価や条件分岐処理への応用を確認していきます。
まずはオブジェクトの比較から。
class EQ():
def __init__(self, sample1):
self.sample1 = sample1
def __eq__(self, sample2):
return self.sample1 == sample2
x = EQ('test')
y = EQ('TEST')
z = EQ('test')
calc1 = x==y
calc2 = x==z
print(calc1)
print(calc2)
print('x: ', x.__dict__)
print('y: ', y.__dict__)
print('z: ', z.__dict__)
<< 結果 >>
クラス EQ() 内のオブジェクト x と y と z をチェックしていますね。
次は条件分岐と併用した比較方法をご紹介。
title = "-- メールアドレスを入力してみよう --"
print(title)
print ("どのメールサービス?")
print ("1. Gmail")
print ("2. yahoo")
choice = input("【1 or 2 ?】 : ")
address = input("アドレスは?(●●@gmailの●部分)")
choice = int(choice)
if choice == 1:
print (address+"@gmail.com")
elif choice == 2:
print (address+"@yahoo.co.jp")
else:
print ("すいません、ちょっとよくわかりません。。。")
<< 結果 >>
こちらはメールアドレスの入力をサポートするプログラムで、 Gmail だったら 1 の処理、 Yahoo だったら 2 の処理と分岐。 ユーザーの入力項目と予め設定した 1 と 2 の等価処理で、比較と条件分岐を併用していますね。
条件分岐との併用はよく登場してきますのでもう一つ例をご紹介。
class FORMAT:
def __init__(self, name, iso):
self.name = name
self.iso = iso
def __format__(self, spec):
if spec == 'short':
return self.iso
return self.name
country = FORMAT('Japan', 'JP')
print('{}'.format(country))
print('{:short}'.format(country))
<< 結果 >>
こちらの例では、プログラムの最終工程であるメソッド実行時の内容と条件分岐の内容を照らし合わせて、出力を制御。 アプリケーション開発の際に、ユーザーがデータをダウンロードする時の選択機能として使えそうですね。
それでは次に正規表現を用いた比較(等価)方法をご紹介します。
CodeCamp提供のPythonデータサイエンスコース
当メディアを運営しているCodeCampではPythonデータサイエンスコースを現役エンジニアのマンツーマンレッスンという形で提供しています。このコースの特徴は
- 数学的な知識がない状態から実務で使えるプログラミングスキルを獲得できる
- 「データ収集」「データ加工」「モデル構築」を習得できる
- 企業のマーケター向けの研修にも取り入れられているカリキュラム
詳細はこちらから確認してみてください!▶︎https://www.lp.codecamp.jp/python
文字列の比較方法【上級編】
正規表現を利用した比較(等価)方法としては、 match() 関数の活用があります。 早速例をご紹介しますね。
import re
list = ["dog run", "does done", "do-do", "cat run"]
for element in list:
s = re.match("(d\w+)\W(\w+)", element)
if s:
print(s.groups())
<< 結果 >>
こちらは list 内の文字列で、頭文字に d が付く要素を出力するようにプログラムされています。 最後の cat run だけ頭文字に d が付いていませんので出力されていないことが分かります。 このように正規表現を使うと、文字列の一部を対象に比較(等価)することが可能となりますね。
\W ・・・ なんだかの値
他にはメールアドレスの入力をチェックするプログラムや入力した文字数をチェックするプログラムなどが思いつきますね。
【メールアドレスをチェックするプログラム】
import re
input = input("メールアドレスを入力して下さい:")
mail = re.match('[^@]+@[^@]+sre[^@]+',input)
if mail:
print("OK")
else:
print("入力したメールアドレスを確認して下さい")
<< 結果 >>
【入力文字数をチェックするプログラム】
import re
input = input("Enter an input string:")
m = re.match('\d{3}\Z', input)
if m:
print("True")
else:
print("False")
<< 結果 >>
これまで match() 関数を用いてきましたが、同意義の search() や findall() も一つの比較(等価)方法になると思います。 今回は基本的な紹介になりますので、 match()関数に限定させていただきました。
ライブラリを活用した比較方法
参考までにライブラリを活用した比較(等価)方法もご紹介。今回は、テキストファイル内に該当の文字があるかないかをプログラムしてみます。
- 【ライブラリ】 mmap(メモリーマップファイル)
参考ページ: https://docs.python.jp/3/library/mmap.html
import mmap
with open('example.txt', 'rb', 0) as file, \
mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) as s:
if s.find(b'banana') != -1:
print('バナナあるよ')
else:
print('ないねぇ')
<< 結果 >>
mmap 特有の find メソッドを使って文字列を比較していますね。
\AIエンジニアに必要なスキルが身に付く/
まとめ
文字列や値の比較方法をマスターしようと思うと、変数や関数、条件分岐などの文法理解が欠かせません。 Pythonの基礎学習がまだの方、不安な方、今一度基礎から見直してみませんか? オンラインでマンツーマンの CodeCamp ならスムーズに加速的に学習を進めていけると思いますよ。
- この記事を書いた人
- オシママサラ