ある文字とある文字が同じかそうではないかを判定することはプログラミングを行う上でよくあります。Pythonでは文字列を比較するための便利な手法がいろいろと存在します。
この記事では、
- 文字列の基本的な比較方法
- 文字列の比較方法にて正規表現を活用する方法
- 文字列の応用的な比較方法
- 比較演算子”==”とis演算子の違いについて
などの基本的な内容から、実践的な内容に関しても解説していきます。
文字列の比較の方法について正しく理解し、必要な場面で使いこなすことができるように、わかりやすく解説します!
※ この記事のコードはPython 3.7, Ubuntu 18.04で動作確認しました。
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
文字列の基本的な比較方法
文字列の基本的な比較方法を説明するために、具体的な例をあげてみましょう。
例えば、会員登録をして利用するシステムにおいて、ログイン時にユーザIDやパスワードなどで本人かどうか確認する処理が必要になります。
本人確認の判定方法はシステム要件によって様々ですが、今回は例として以下のような判定方法だと仮定します。
画面上から入力されたユーザIDに紐づくパスワードの文字列が事前に登録されたデータベースのパスワードの文字列と一致しているかどうかを判定。
上記のような処理を実現するために、比較演算子というものを活用します。
まずはサンプルをみていきましょう。
dbPw = "zaq12wsx" #データベースに登録されているパスワード inputVal_1 = "zaq12wsx" #ユーザ入力値例1 print("inputVal_1:{0}".format(inputVal_1 == dbPw)) inputVal_2 = "123456" #ユーザ入力値例2 print("inputVal_2:{0}".format(inputVal_2 == dbPw))
実行結果
inputVal_1:True inputVal_2:False
文字列同士の比較に”==”という比較演算子を使用し、左右の文字列が一致する場合はTrue、異なる場合はFalseを返します。
もし、文字列同士が異なる場合にTrueを返したい場合は、”!=”という比較演算子を使います。
文字列の比較で正規表現を使用する方法
次に文字列の比較に正規表現を使用する方法についてみていくことにしましょう。
正規表現とは文字列の集まりを一つの文字列で表すための手法であり、文字列比較においてとても便利なものです。ここでも具体的な例を元に使い方をみていくことにしましょう。
オンラインショップの注文画面にて電話番号の形式が正しく入力されているかを確認する処理があるとします。
電話番号の形式は以下の通りと仮定します。
”2桁の数字+ハイフン+4桁の数字+ハイフン+4桁の数字” (例 03-1234-5678)
import re result = "" input_tel1 = "03-1111-2222" input_tel2 = "03-452-22234" def check(tel): if re.match('[0-9]{2}-[0-9]{4}-[0-9]{4}', tel): return "OK" else: return "NG" print("input_tel1{0}".format(check(input_tel1))) print("input_tel2{0}".format(check(input_tel2)))
実行結果
input_tel1:OK input_tel2:NG
正規表現を利用できるようにするために必要なパッケージをインポート(import re)したのちに、match関数を使い入力された電話番号が形式に一致するか比較をしています。
このように正規表現を使い文字列を比較することで様々なパターンの文字列比較が可能となります。
文字列の応用的な比較方法
では次に、もう少し応用的な比較方法について解説します。
in演算子を使用した比較方法
文字列に対して比較する文字列が含まれているかどうかを調べる際にin演算子を用いることができます。
例えば、入力されたURLの中に含まれるドメインの文字列をin演算子で調べる処理の例は以下の通りです。
url = 'http://www.google.com/sample/top/' googleDomain = 'www.google.com' bingDomain = 'www.bing.com' print(googleDomain in url) print(bingDomain in url)
実行結果
True False
文字列に日本語を含む場合の注意点
次に、文字列に日本語を含む場合の比較方法についての注意点を解説します。
日本語を含む文字列の比較処理を行う場合、Python2系とPython3系で異なる点があります。
まずはPython2系のサンプルをご確認ください。
#Python2系の場合 address = '東京都新宿区東新宿1−1−1' unicode_address = u'東京都新宿区東新宿1−1−1' print(u'東京都' in unicode_address) print(u'東京都' in address) #UnicodeDecodeErrorが発生 print('東京都' in unicode_address) #UnicodeDecodeErrorが発生 print('東京都' in address)
実行結果
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
次のPython3系のサンプルをご確認ください。
#Python3系の場合 address = '東京都新宿区東新宿1−1−1' unicode_address = u'東京都新宿区東新宿1−1−1' print(u'東京都' in unicode_address) print(u'東京都' in address) print('東京都' in unicode_address) print('東京都' in address)
実行結果
True True True True
Pythonの文字列には「str型」と「unicode型」の2つが存在します。
また、文字列の最初にuをつけることでunicode型の文字列として扱うことになります。
Python2系では文字列型とunicode型を文字列比較するとUnicodeDecodeErrorが発生し、正常に処理ができません。そのため、unicode型同士、文字列型同士にて比較処理を行うことでエラーを回避できます。
しかし、Python3系ではunicode型、文字列型を意識せずに問題なく比較処理ができます。
比較演算子”==”とis演算子の違いについて
文字列の比較演算子として”==”の他にis演算子があります。
ですが、先に大事なポイントをお伝えします。
文字列が同じ値かどうかを調べる場合は”==”を使い、is演算子は使用しないようにしましょう。
なぜならis演算子は文字列の値が同じでも結果がFalse(異なる)となる場合があるからです。
なぜ異なる結果がでる場合があるかですが、is演算子は文字列の値が同じかを判定しているわけではなく、インスタンスが同じかどうかを判定しているためです。
インスタンスについては以下の記事を参考にしてください。
is演算子の利用が推奨される場面はNoneと比較する場合です。
メリットとして”==”と比べてis演算子の方が比較処理の速度が早い点が挙げられます。
import re input_tel = "03-333-42222" if re.match('[0-9]{2}-[0-9]{4}-[0-9]{4}', input_tel) is None: print('正しい電話番号の形式で入力してください')
実行結果
正しい電話番号の形式で入力してください
まとめ
ここでは、文字列の比較について、基本的な方法から関連する様々な比較方法について具体例を交えながらご紹介しました。
文字列の比較には比較演算子(“==”もしくは”!=”)を用い、少し複雑な文字列の比較には正規表現も活用すること、そしてis演算子はNoneとの比較で用いることなどをお伝えしました。
正しい文字列の比較方法を身につけて、実践の場でぜひ活かしてください。
もし、文字列の比較方法を忘れてしまったら、この記事を思い出してくださいね!