【Python入門】文字列比較(等価)のやり方とは?



【Python入門】文字列比較(等価)のやり方とは?

Pythonに限らず、プログラムを構成する上で欠かせない文字や数値の比較処理。
今回は、Pythonプログラムでよく登場する「等価」についてご紹介します。
参考書などではこのようなセクションを設けていないと思いますので、プログラミング初心者の方にとっては参考になると思いますよ。

目次
  1. 【Python入門】文字列比較(等価)のやり方とは?
  2. 文字列の比較が行われるケース
  3. 文字列の比較方法【基礎編】
  4. 文字列の比較方法【中級編】
  5. 文字列の比較方法【上級編】
  6. ライブラリを活用した比較方法
  7. まとめ

【Python入門】文字列比較(等価)のやり方とは?

文字列や値を比較する前に、まずその必要性を改めて確認してみます。

文字列の比較が行われるケース

image

  • データの照合
  • 条件分岐
  • データ加工

「データの照合」は、ログイン画面をイメージしていただくと分かりやすいと思います。 予め登録されているデータと入力データが正しければ True(真) で次のプロセスに、間違っていれば False(偽) で次のプロセスに進めない。馴染みのある工程なのでイメージしやすいと思います。

次の「条件分岐」は、プログラムを構成する上でよく登場してくる処理。 例えば、「A と B の値(文字)が一致したら C の工程に、一致しなかったら D の工程に」という具合です。 if文と一緒によく使われますね。

最後のデータ加工は、特定の文字(数値)を含むデータファイルを検出して、その文字を違う文字(数値)に置き換えたり、自分の欲しい情報がリリースされたらメール配信するなどアプリケーション要素を含むケースです。

このように文字列の比較は、単純な工程であるにも関わらず様々な場面で活用。もちろん人工知能やデータ解析などでも登場してきますね。 それでは文字列や数値の比較の基礎である「等価」についてコードを交えて、ご紹介していきたいと思います。

文字列の比較方法【基礎編】

image

こちらではシンプルな例を元に、比較(等価)について馴染んでいけたらと思います。等価処理には、以下の演算子が使用可能。

  • ==
  • in

== は等価演算子で、 in は for文などで登場する演算子。 まずは等価演算子から。

a = 'おおしま'
b = 'OSHIMA'
c = 'おおしま'

print(a == b)
print(a == c)

<< 結果 >>

image

次に in を使った等価のコード。

s = "This place is safe."
'safe' in s

<< 結果 >>

image

このあたりはPythonの基礎学習を終えている方にとっては、簡単なプログラムなので特に説明も必要ないですね。

文字列の比較方法【中級編】

image

初級編では単純に文字や数値の等価を行いました。次は、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__)

<< 結果 >>

image

クラス 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 ("すいません、ちょっとよくわかりません。。。")

<< 結果 >>

image

こちらはメールアドレスの入力をサポートするプログラムで、 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))

<< 結果 >>

image

こちらの例では、プログラムの最終工程であるメソッド実行時の内容と条件分岐の内容を照らし合わせて、出力を制御。 アプリケーション開発の際に、ユーザーがデータをダウンロードする時の選択機能として使えそうですね。

それでは次に正規表現を用いた比較(等価)方法をご紹介します。

文字列の比較方法【上級編】

image

正規表現を利用した比較(等価)方法としては、 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())

<< 結果 >>

image

こちらは list 内の文字列で、頭文字に d が付く要素を出力するようにプログラムされています。 最後の cat run だけ頭文字に d が付いていませんので出力されていないことが分かります。 このように正規表現を使うと、文字列の一部を対象に比較(等価)することが可能となりますね。

\W ・・・ なんだかの値

他にはメールアドレスの入力をチェックするプログラムや入力した文字数をチェックするプログラムなどが思いつきますね。

【メールアドレスをチェックするプログラム】

import re

input = input("メールアドレスを入力して下さい:")
mail = re.match('[^@]+@[^@]+sre[^@]+',input)

if mail:
    print("OK")
else:
    print("入力したメールアドレスを確認して下さい")

<< 結果 >>

image

【入力文字数をチェックするプログラム】

import re

input = input("Enter an input string:")
m = re.match('\d{3}\Z', input)

if m:
    print("True")
else:
    print("False")

<< 結果 >>

image

これまで match() 関数を用いてきましたが、同意義の search() や findall() も一つの比較(等価)方法になると思います。 今回は基本的な紹介になりますので、 match()関数に限定させていただきました。

ライブラリを活用した比較方法

image

参考までにライブラリを活用した比較(等価)方法もご紹介。今回は、テキストファイル内に該当の文字があるかないかをプログラムしてみます。

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('ないねぇ')

<< 結果 >>

image

mmap 特有の find メソッドを使って文字列を比較していますね。

まとめ

文字列や値の比較方法をマスターしようと思うと、変数や関数、条件分岐などの文法理解が欠かせません。 Pythonの基礎学習がまだの方、不安な方、今一度基礎から見直してみませんか? オンラインでマンツーマンの CodeCamp ならスムーズに加速的に学習を進めていけると思いますよ。

関連記事

オシママサラ
この記事を書いた人
オシママサラ
\無料体験開催中!/自分のペースで確実に習得!
オンライン・プログラミングレッスンNo.1のCodeCamp