Pythonの文字列比較の方法 【完全一致、部分一致、正規表現の利用】

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
判定したい要素  in  調査対象のリスト

という形で基本的に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型と同じでindexメソッドを使いますが同じように、
同じ要素が複数ある場合は最初のインデックスになり、要素がないとエラーになります
コード
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の完全一致の時と同じで

判定したい要素  in  調査対象

この形で使います

コード

print("h" in "henjinn")
print("a" in "henjinn")
print("n" in "henjinn")

実行結果

True
False
True

listの時と同じようにnot in も使えます

先頭や末尾の部分一致の判定の方法

先頭の場合

先頭の部分一致の場合はstartswithメソッドを使います

startswithメソッドは

判定対象の文字列.startswith(判定したい要素)

この形で使います

コード

print("henjinn".startswith("hen"))
print("henjinn".startswith("en"))
print("henjinn".startswith("henji"))

実行結果

True
False
True

末尾の場合

末尾の部分一致の場合はendswithメソッドを使います

使い方はstartswithメソッドと同じで

判定対象の文字列.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'>

使い方は

re.fullmatch(判定したい要素,判定対象の文字列)
こういう形で使います
実行結果の出力が少し特殊な形になっていますが、
span()というのは判定した文字列のうちどこからどこまで一致したかを表したもので、
今回は完全一致の話なのであまり関係ないです
matchの部分はもちろん一致したとこを表しています

正規表現を用いた部分一致の判定の方法

一致してる部分の判定

一致してる部分の判定にはsearchメソッドを使います

使い方はfullmatchメソッドと同じで

re.search(判定したい要素,判定対象の文字列)
この形で使います
コード
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メソッドと同じで

re.match(判定したい要素,判定対象の文字列)
この形で使うことができます

コード

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メソッドはその逆で小文字に変換してくれます

使い方は簡単で下の形で使います

対象の文字列.upper()
コード
x = "HeNjinN"
print("henjinn" == x.lower())
print("he" in x.lower())
print("ji" in x.lower())

実行結果

True
True
True

一致してそうで一致しない場合

一致しそうでしない場合は何かしら原因があります

例えば下記の点に注目してみてください

  • 余計な文字や空白は含まれてないか
  • 半角と全角が混じってないか
  • 6とδのように似てるが違うようなものは含まれてないか

まとめ

完全一致と部分一致について下記の方法で主に説明しました

  • 基本
  • 正規表現
正規表現の方はまだまだ奥が深いので気になる人は調べてみましょう