Pythonで文字列比較をしていると、 print() では同じに見えるのに == で比較すると不一致になることがあります。
これは ノーブレークスペース( / ) が原因かもしれません。
print() では同じに見えるのに一致しない?
例えば、以下のコードを実行すると、見た目では str1 と str2 は同じに見えますが、実際には異なります。
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で文字列比較がうまくいかない場合、 を疑ってみるのがポイントです


コメント