Python を使用した文字列の比較

Python では、文字列は文字のシーケンスであり、オブジェクトとしてメモリに効果的に格納されます。各オブジェクトは次の方法で識別できます。 id() 以下に示すように、メソッド。 Python は同じ値を持つメモリ内のオブジェクトを再利用しようとします。これにより、Python でのオブジェクトの比較が非常に高速になります。

$ python
Python 3.9.0 (v3.9.0:9cf6752276, Oct  5 2020, 11:29:23) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = "abc"
>>> b = "abc"
>>> c = "def"
>>> print (id(a), id(b), id(c))
(139949123041320, 139949123041320, 139949122390576)
>>> quit()

文字列を比較するために、Python にはいくつかの異なる演算子が用意されています。まず、以下で詳しく説明します。次に、両方について説明します。 stringre モジュールには、大文字と小文字を区別しない不完全一致を処理するメソッドが含まれています。 3 番目に、複数行の文字列を処理するには、 difflibモジュール かなり便利です。多くの例は、それらの使用方法を理解するのに役立ちます。

== および != 演算子を使用して文字列を比較する

基本的な比較演算子として使用するとよいでしょう == および !=。これらは、整数値や浮動小数点数の場合とまったく同じように機能します。の == オペレーターが返す True 完全一致がある場合、そうでない場合 False 返されます。対照的に、 != オペレーターが返す True 一致するものがない場合、それ以外の場合は戻ります False. リスト1 はこれを示しています。

for ループでは、スイスの都市名「ローザンヌ」を含む文字列が他の場所のリストのエントリと比較され、比較結果が標準出力に出力されます。

リスト1:


listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "Lausanne"

for place in listOfPlaces:
    print (f"comparing {place} with {currentCity}: %{place == currentCity}")

上記の出力から Python スクリプトを実行すると、次のようになります。

$ python3 comparing-strings.py
comparing Berlin with Lausanne: False
comparing Paris with Lausanne: False
comparing Lausanne with Lausanne: True

  == および is オペレーター

Pythonには2つの比較演算子があります == および is。一見すると同じように見えますが、実は違います。

== 2 つの変数を、それらが表す値に基づいて比較します。対照的に、 is 演算子は、メモリ内のオブジェクト ID に基づいて 2 つの変数を比較します。

John (Doe) と John (Moe) は両方とも John と呼ばれます。もし彼らを名前だけに還元できれば、彼らの価値は同じですが、質的には異なる人物であることに変わりはありません。

次の例は、文字列値を持つ 3 つの変数についてそれを示しています。 2 つの変数 a および b は同じ値を持ち、Python はメモリ使用量を最小限に抑えるために同じオブジェクトを参照します。

これはデフォルトで単純な型と文字列に対して行われますが、他のオブジェクトに対しては行われません。

>>> a = 'hello'
>>> b = 'hello'
>>> c = 'world'
>>> a is b
True
>>> a is c
False
>>> id(a)
140666888153840
>>> id(b)
140666888153840
>>> 

値が変更されるとすぐに、Python はオブジェクトを再インスタンス化し、変数を割り当てます。次のコードスニペットでは b 値 2 を取得し、その後 b および c 同じオブジェクトを参照します。

>>> b = 'world'
>>> id(b)
140666888154416
>>> id(c)
140666888154416

その他の比較演算子

辞書編集上の順序に関する比較には、比較演算子を使用できます。 <, >, <=, >=。比較自体は文字ごとに行われます。順序はアルファベットの文字の順序によって異なります。この順序は、Python コードの実行中にマシンで使用されている文字テーブルによって異なります。

順序では大文字と小文字が区別されることに注意してください。ラテン文字の例として、「Bus」は「bus」の前に来ます。 リスト2 は、これらの比較演算子が実際にどのように機能するかを示しています。

リスト2:


listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "Lausanne"

for place in listOfPlaces:
    if place < currentCity:
            print (f"{place} comes before {currentCity}")
    elif place > currentCity:
            print (f"{place} comes after {currentCity}")
    else:
            print (f"{place} is equal to {currentCity}")

上記の出力から Python スクリプトを実行すると、次のようになります。

$ python3 comparing-strings-order.py
Berlin comes before Lausanne
Paris comes after Lausanne
Lausanne is equal to Lausanne

大文字と小文字を区別しない文字列比較

前の例は、文字列間の完全一致に焦点を当てていました。大文字と小文字を区別しない比較を可能にするために、Python は次のような特別な文字列メソッドを提供します。 upper() および lower()。どちらも、対応する文字列オブジェクトのメソッドとして直接使用できます。

upper() 文字列全体を大文字に変換し、 lower() をそれぞれ小文字に変換します。に基づく リスト1 次のリストは、その使用方法を示しています。 lower() 方法。

ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、Gitを学習するための実践的で実用的なガイドを確認してください。 グーグルGitコマンドを停止し、実際に 学ぶ それ!

リスト3:


listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "lausANne"

for place in listOfPlaces:
    print (f"comparing {place} with {place.lower() == currentCity.lower()}: {currentCity}")

出力は次のとおりです。

$ python3 comparing-strings-case-insensitive.py
comparing Berlin with lausANne: False
comparing Paris with lausANne: False
comparing Lausanne with lausANne: True

正規表現 (RegEx) を使用した文字列の比較

A 正規表現 – 略して「正規表現」 – 文字の特定のパターンを定義します。

Python でこのメカニズムを利用するには、 re モジュール まず特定のパターンを定義し、次に。繰り返しますが、次の例は以下に基づいています。 リスト1。検索パターンは「bay」に一致し、小文字または大文字で始まります。正確には、次の Python コードは、文字列のどの位置 (先頭、中間、末尾) に関係なく、検索パターンが発生するすべての文字列を検索します。

リスト4:


import re


listOfPlaces = ["Bayswater", "Table Bay", "Bejing", "Bombay"]


pattern = re.compile("[Bb]ay")

for place in listOfPlaces:
    if pattern.search(place):
        print (f"{place} matches the search pattern")

出力は次のとおりで、場所のリストの「Bayswater」、「Table Bay」、「Bombay」と一致します。

$ python3 comparing-strings-re.py
Bayswater matches the search pattern
Table Bay matches the search pattern
Bombay matches the search pattern

複数行とリストの比較

これまでのところ、比較はほんの数語で行われています。を使用して、 difflib モジュール Python は、複数行の文字列や単語のリスト全体を比較する方法も提供します。出力は、diff ツールのさまざまな形式に従って構成できます。

次の例 (リスト5) 2 つの複数行の文字列を 1 行ずつ比較し、追加だけでなく削除も示します。の初期化後、 Differ 12 行目のオブジェクトを使用して比較が行われます。 compare() 15 行目のメソッド。結果は標準出力に出力されます。


import difflib
 


original = ["About the IIS", "", "IIS 8.5 has several improvements related", "to performance in large-scale scenarios, such", "as those used by commercial hosting providers and Microsoft's", "own cloud offerings."]


edited = ["About the IIS", "", "It has several improvements related", "to performance in large-scale scenarios."]


d = difflib.Differ()
 

diff = d.compare(original, edited)
 

print ('n'.join(diff))

スクリプトを実行すると、以下のような出力が作成されます。削除のある行は で示されます。 - 記号はありますが、追加のある行は a で始まります。 + サイン。さらに、変更のある行は疑問符で始まります。変更は次を使用して示されます ^ 適切な位置に標識を設置します。インジケーターのない行は同じです。

$ python comparing-strings-difflib.py
  About the IIS
  
- IIS 8.5 has several improvements related
?  ^^^^^^

+ It has several improvements related
?  ^

- to performance in large-scale scenarios, such
?                                        ^^^^^^

+ to performance in large-scale scenarios.
?                                        ^

- as those used by commercial hosting providers and Microsoft's
- own cloud offerings.

まとめ

この記事では、Python で文字列を比較するさまざまな方法を学びました。この概要が、開発者にとって効果的なプログラミングに役立つことを願っています。

謝辞

著者は、記事の準備中にサポートしてくれた Mandy Neumeyer に感謝したいと思います。

タイムスタンプ:

より多くの スタックアバス