Pythonの文字列比較の方法 【完全一致、部分一致、正規表現の利用】
今回はpythonでの文字列の比較の方法について解説していこうと思います。
pythonの文字列の比較には大きく分けて完全一致と部分一致があります。
またpythonのライブラリのreを用いた正規表現による一致の判定の説明もしていきます
文字列の基本的な完全一致での比較・検索方法
まずは文字列の完全一致について説明していきます。
最初は正規表現など用いずに基本的な方法で一致の判定をしていきたいと思います。
完全一致の基本的な方法
数値の時と同じで完全一致の場合、==かもしくはisを使います。
==を使った場合
コード
n="henjinn" if "henjinn" == n: print("等しい") else: print("等しくない")
実行結果
等しい
isを使った場合
コード
n="henjinn" if "henjinn" is n: print("等しい") else: print("等しくない")
実行結果
等しい
また等しくないことを比べたい場合は!= もしくはnot isを使います。
!=を使った場合
コード
n="henjinn" if "yakata" != n: print("等しくない") else: print("等しい")
実行結果
等しくない
not isを使った場合
コード
n="henjinn" if not("yakata" is n): print("等しくない") else: print("等しい")
実行結果
等しくない
listの中の要素の完全一致の判定
listの中の要素の完全一致の判定にはinを使います
そのほかにも幾つ含まれているか、要素のインデックスまで取得できます
同じ要素がlistの中に含まれてるか判定する
listの完全一致の判定は基本的にinを使って判定します
コード
list = ["apple","orange","lemon"] if "apple" in list: print("There is an apple") else: print("There is no apple")
実行結果
There is an apple
という形で基本的にlistの中の要素を調べることができます。
また、(判定したい要素 in 調査対象のリスト)この形で記述すれば、
要素がリスト内に存在すればTrue、存在しなければFalseを返すので
ifを使わなくても出力してやればすぐにわかります
コード
list = ["apple","orange","lemon"] print("apple" in list) print("grape" in list) print("lemon" in list)
実行結果
True False True
またnot inを使うと要素が存在しないときにTrue、存在するときにFalseを返すようになり
存在しないかを判定できます
同じ要素がlistの中にいくつ含まれてるか個数を判定する
listの中に指定の要素がいくつ含まれるか数えるにはlist型でのみ使えるcountメソッドを使います
コード
list = ["apple","orange","apple","orange","lemon","apple","orange","orange"] print(list.count("apple")) print(list.count("orange")) print(list.count("lemon"))
実行結果
3 4 1
同じ要素がlistの中でどのインデックスにあるか判定する
listの中の指定の要素のインデックスを取得します
indexメソッドを使うのですが2つ注意点があって
- 同じ要素が複数ある場合は一番最初の要素のインデックス
- 要素がないとエラーになる
この2点に注意しましょう
コード
list = ["apple","orange","apple","orange","lemon","apple","orange","orange"] print(list.index("apple")) print(list.index("orange")) print(list.index("lemon"))
実行結果
0 1 4
tupleの中の要素の完全一致の判定
tuple型の場合も基本的にlist型と同じです
同じ要素がtupleの中に含まれているか判定する
コード
list = ("apple","orange","apple","orange","lemon","apple","orange","orange",1,3,4,4) print("grape" in list) print(1 in list) print(4 in list)
実行
False True True
同じ要素がtupleの中にいくつ含まれてるか個数を判定する
コード
list = ("apple","orange","apple","orange","lemon","apple","orange","orange",1,3,4,4) print(list.count("apple")) print(list.count(1)) print(list.count(4))
実行結果
3 1 2
同じ要素がtupleの中でどのインデックスにあるか判定する
list = ("apple","orange","apple","orange","lemon","apple","orange","orange",1,3,4,4) print(list.index("apple")) print(list.index(1)) print(list.index(4))
実行結果
0 8 10
文字列の基本的な部分一致での比較・検索方法
次に部分一致について解説していきます
部分一致の基本的な方法
部分一致では基本的にinを使います
listの完全一致の時と同じで
この形で使います
コード
print("h" in "henjinn") print("a" in "henjinn") print("n" in "henjinn")
実行結果
True False True
listの時と同じようにnot in も使えます
先頭や末尾の部分一致の判定の方法
先頭の場合
先頭の部分一致の場合はstartswithメソッドを使います
startswithメソッドは
この形で使います
コード
print("henjinn".startswith("hen")) print("henjinn".startswith("en")) print("henjinn".startswith("henji"))
実行結果
True False True
末尾の場合
末尾の部分一致の場合はendswithメソッドを使います
使い方はstartswithメソッドと同じで
print("henjinn".endswith("nn")) print("henjinn".endswith("in")) print("henjinn".endswith("jinn"))
実行結果
True False True
正規表現を用いた文字列の比較・検索方法
次に正規表現を用いた一致の判定の仕方を説明していきます
主にpythonのライブラリのreを用いるのですが、正規表現について全て話してると
奥が深くて長くなってしまいますので、今回はすぐに使えるとことそれに付随する必要な
部分のみを絞ってお話ししていきます
正規表現用いた完全一致の判定の方法
完全一致にはfullmatchメソッドを使います
コード
import re x = "henjinn" print(re.fullmatch("henjinn",x))
実行結果
<re.Match object; span=(0, 7), match='henjinn'>
使い方は
正規表現を用いた部分一致の判定の方法
一致してる部分の判定
一致してる部分の判定にはsearchメソッドを使います
使い方はfullmatchメソッドと同じで
import re x = "henjinn" print(re.search("en",x)) print(re.search("nn",x)) print(re.search("ji",x))
実行結果
<re.Match object; span=(1, 3), match='en'> <re.Match object; span=(5, 7), match='nn'> <re.Match object; span=(3, 5), match='ji'>
先頭一致
先頭一致の場合はmatchメソッドを使います
使い方はfullmatchメソッドやserachメソッドと同じで
コード
import re x = "henjinn" print(re.match("en",x)) print(re.match("hen",x))
実行結果
None <re.Match object; span=(0, 3), match='hen'>
大文字小文字区別しない
大文字小文字を区別しない一致というのは
abcとABcを同一のものとみなして判定するみたいなことですね
普通にやると別のものとして判定されるんですけど、
IGNORECASEオプションを使うと大文字小文字の区別をしないで判定できます。
コード
import re x = "HeNjinN" print(re.search("henjinn",x,flags=re.IGNORECASE)) print(re.match("he",x,flags=re.IGNORECASE)) print(re.search("ji",x,flags=re.IGNORECASE))
実行結果
<re.Match object; span=(0, 7), match='HeNjinN'> <re.Match object; span=(0, 2), match='He'> <re.Match object; span=(3, 5), match='ji'>
文字列の大文字小文字を区別しない一致の判定
正規表現で大文字小文字を区別しない一致の判定方法を説明しましたが、
正規表現を使わない場合はどうなるでしょうか
正規表現を使わないで大文字小文字の区別をしないで、一致の判定をするには
upperメソッドかlowerメソッドを使う必要があります。
upperメソッドを対象に使うことで対象を全て大文字に変換、
lowerメソッドはその逆で小文字に変換してくれます
使い方は簡単で下の形で使います
x = "HeNjinN" print("henjinn" == x.lower()) print("he" in x.lower()) print("ji" in x.lower())
実行結果
True True True
一致してそうで一致しない場合
一致しそうでしない場合は何かしら原因があります
例えば下記の点に注目してみてください
- 余計な文字や空白は含まれてないか
- 半角と全角が混じってないか
- 6とδのように似てるが違うようなものは含まれてないか
まとめ
完全一致と部分一致について下記の方法で主に説明しました
- 基本
- 正規表現