Pythonの文字列比較で謎の不一致が発生?原因は かも

※当サイトではアフィリエイト広告を利用しています

Pythonで文字列比較をしていると、 print() では同じに見えるのに == で比較すると不一致になることがあります。
これは ノーブレークスペース(  / ) が原因かもしれません。

print() では同じに見えるのに一致しない?

例えば、以下のコードを実行すると、見た目では str1str2 は同じに見えますが、実際には異なります。

str1 = "hello world"  # 普通の半角スペース
str2 = "hello world"  # ノーブレークスペース( )

print(str1)  # hello world
print(str2)  # hello world
print(str1 == str2)  # False

これは (ノーブレークスペース)が (通常の半角スペース)とは異なる文字として扱われるためです。

repr() で隠れた違いを発見

文字列の中身を厳密に確認するには repr() を使うのが便利です。

print(repr(str1))  # 'hello world'
print(repr(str2))  # 'hello\u00a0world'

このように が混ざっていることが確認できます。

  を通常のスペースに変換して比較

もし   が問題なら、 replace() を使って通常のスペースに変換すれば解決できます。

normalized_str1 = str1.replace("\u00A0", " ")
normalized_str2 = str2.replace("\u00A0", " ")

print(normalized_str1 == normalized_str2)  # True

他の特殊スペースも考慮する

  以外にも、全角スペース( )などが原因で比較が失敗することがあります。まとめて対策するには、以下のような関数を使うと便利です。

import unicodedata

def normalize_space(text):
    return text.replace("\u00A0", " ").replace("\u3000", " ").strip()

str1 = "hello world"
str2 = "hello world"

print(normalize_space(str1) == normalize_space(str2))  # True

まとめ

  •  ()は 普通の半角スペースと見た目が同じだが別の文字 なので == で比較すると一致しない。
  • print() では違いがわからないため、 repr() を使って確認すると良い。
  • replace("\u00A0", " ") で通常のスペースに変換すると解決できる。
  •  (全角スペース)も一緒に対策するとより安全。

Pythonで文字列比較がうまくいかない場合、   を疑ってみるのがポイントです

コメント