今回はpythonで文字列が一致しているかどうかを確認する方法を紹介します。
この方法を応用すると、「特定のキーワードが含まれるデータのみデータの抽出する」「入力ミスがないか判定する」といったことが可能です。
pythonで判定できる一致の種類
今回紹介する方法で判定できる一致の種類は次のとおりです。
- 完全一致: == と !=
- 部分一致: in と not in
- 前方一致: .startwith()
- 後方一致: .endwith()
- 正規表現マッチ
この記事に書いてあるコードは全てグーグルコラボラトリーで記述・動作確認をしています。グーグルコラボラトリーはGoogleアカウントがあれば誰でも使用でき、難しい環境構築も必要なくすぐに使用できます。
文字列が完全一致しているかの確認: == と !=
2つの文字列が完全に一致しているかを確認するためには、== 演算子を使用します。
使い方は数式と同様です。完全に一致していればTrue, 完全一致でなければFalseを返します。
print('apple' == 'apple')
print('apple' == 'apply')
出力:
True
False
!= 演算子は完全一致であればFalse、完全一致でない場合はTrueを返します。
== 演算子の逆の結果を返す点に注目です。
print('apple' != 'apple')
print('apple' != 'apply')
出力:
False
True
文字列が部分一致しているかの確認: in と not in
部分一致を調べるには、in演算子を使用します。
書き方は a in b で 「 b という文字列の中に a という文字列が含まれているか」となり、含まれていれば True、含まれていなければ False を返します。
print('app' in 'apple')
print('abc' in 'apple')
出力:
True
False
not inは inと同じことを判断しますが、部分一致していれば False、部分一致でないなら True と逆の結果を返します。
print('app' not in 'apple')
print('abc' not in 'apple')
出力:
False
True
前方一致を判断する: startswith()
ある文字列が指定した文字列から始まっている(前方一致)かどうかを判断するには、startswith()を使います。
前方一致していればTrue, 一致していない場合はFalseを返します。
print('apple'.startswith('app'))
print('banana'.startswith('na'))
出力:
True
False
startswith()は検索開始位置と終了位置を指定できます。
startswith()を使う際に3点ほど注意点があります。
- 文字列の1文字目は0とカウントされる
- 終了位置はn+1で指定する
- スペースはカウントされない
startswith()には複数の文字列を指定することが可能です。
その際リストではエラーになるので、タプルで指定します。
複数指定した文字列のいずれかが前方一致すればTrue, 一致しなければFalseを返します。
print('apple'.startswith(('le','pp', 'ap')))
print('apple'.startswith(('ba','na','wo')))
出力:
True
False
完全一致や部分一致での != や not in のような否定形は startswith() には存在しません。
どうしても startswith()を否定形で使いたい場合は、自分で関数を作成しましょう。
今回は not_startswith という名前で関数を作成してみます。
if文を使って、前方一致の場合はFalse、一致しない場合はTrueを返すように記述します。
def not_startswith(string, notstr) :
if string.startswith(notstr):
return False
else:
return True
not_startswith(‘判定したい文字列’, ‘指定する文字列’)で前方一致の場合False、そうでない場合はTrueを返します。
元のstartswithと使い方が違う点に注意です。
それでは使ってみましょう。
print(not_startswith('apple', 'app'))
print(not_startswith('apple', 'le'))
出力:
False
True
後方一致を判断する:endswith()
文字列の末尾が指定した文字列(後方一致)であるかを判断するためにはendswith()を使用します。
後方一致していればTrue、一致していない場合はFalseを返します。
print('apple'.endswith('le'))
print('apple'.endswith('app'))
出力:
True
False
startswith()同様、判定位置の指定も可能です。指定の際の注意点も基本は同じですが、途中の文字列を指定する場合は、判定の終了位置も記述する必要があるようです。
ちなみに位置指定に-(マイナス)を使用すると-1を文字列の最後として後ろから指定できます。
print('Hello world!'.endswith('wor', 6))
print('apple'.endswith('pl',-3,-1))
出力:
False
True
endstwith()も複数の文字列を指定することが可能です。タプルで記述する点、タプルの中の文字列が1つでも後方一致すればTrueを返す点もstartswith()同様です。
print('apple'.endswith(('le','pp', 'ap')))
print('apple'.endswith(('ba','na','wo')))
出力:
True
False
endswith()にも否定系がないので、if文を用いて not_endswith()という関数を作成してみましょう。
def not_endswith(string, notstr) :
if string.endswith(notstr):
return False
else:
return True
使い方は先ほど作成したnot_startswith()と同じです。
print(not_endswith('apple', 'le'))
print(not_endswith('apple', 'app'))
出力:
False
True
正規表現パターンで一致を判定
正規表現とは文字列の集合(パターン)を表す汎用的な記法です。
例えば郵便番号は000-0000と「3桁の数字+ハイフン+4桁の数字」というパターンが決まっています。他にもサイトページのURLやメールアドレス、電話番号などもパターンが決まっていますね。
パターンが決まっているものは、正規表現を使うと簡単に表すことが可能です。
pythonで正規表現位扱うにはreモジュールをインポートが必要です。reモジュールは標準ライブラリのため、環境構築の必要なくすぐにインポートできます。
import re
正規表現で完全一致を判定する: re.fullmatch()
正規表現の完全一致を判定したい時はre.fullmatch()です。 〇〇〇〇@■■■.comという形式のメールアドレスかどうかを判定します。
reモジュールを使用した場合は、その位置と文字列を返し、一致していない場合はNoneを返します。
mail = 'adcdefg@hijkl.com'
print(re.fullmatch(r'[a-z]+@[a-z]+\.com', mail))
print(re.search(r'[a-z]+@[a-z]+\.net', mail))
出力:
<re.Match object; span=(0, 17), match=’adcdefg@hijkl.com‘>
None
正規表現で前方一致を判定: re.match
re.match()は正規表現パターンでの前方一致を判定できます。
code_number = '000-1111 222-3333-4444'
print(re.match('[0-9]{3}-[0-9]{4}', code_number))
print(re.match('[0-9]{3}-[0-9]{4}-[0-9]{4}', code_number))
出力:
<re.Match object; span=(0, 8), match=’000-1111′>
None
post_cpdeに格納されていた番号のうち、郵便番号は判定できましたが、携帯電話番号を判定することはできませんでした。
正規表現で部分一致・前方一致・後方一致: re.serarch()
re.search()を使うと部分一致、前方一致、後方一致を判定できます。
指定した文字列が文字列に含まれているかを判断するので、一致の種類は判別できません。
print(re.search('[0-9]{3}-[0-9]{4}', code_number))
print(re.search('[0-9]{3}-[0-9]{4}-[0-9]{4}', code_number))
出力:
<re.Match object; span=(0, 8), match=’000-1111′>
<re.Match object; span=(9, 22), match=’222-3333-4444′>
re.match()では携帯電話番号はNoneを返されましたが、re.search()では郵便番号も携帯電話番号も判定することができました。
まとめ
今回は文字列が一致しているかどうかを判断する方法を紹介しました。
re.search()やre.search()を活用できれば、メールアドレスや電話番号などのパターンが決まっている情報の取り扱いが簡単になります。
よくある質問
- 正規表現で大文字や小文字、数字が混ざっている場合はどうすればいいですか?
-
[A-Za-z0-9]で大文字や小文字、数字すべて指定可能です。
- エクセルなどのデータで一致しているかどうかを判定したいです。
-
エクセルなどのデータを取り扱う場合、pandasライブラリを使用しましょう。こちらの記事で指定した条件にデータが一致しているかを判定する方法を紹介しています
- pythonについてもっと勉強したいです!
-
pythonを勉強するには書籍・動画・プログラミングスクールなどがあります。特にUdemyは有料ですが、pythonを勉強できる動画がたくさんあるのでおすすめです。
合わせて読みたい
コメント