Python 3.9以降、文字列操作において特定の接頭辞(Prefix)や接尾辞(Suffix)を削除するための専用メソッド removeprefix() と removesuffix() が追加されました。
従来、文字列のトリミングには lstrip() や rstrip()、あるいはスライス機能が使われていましたが、これらは意図しない文字まで削除してしまうリスクや、コードの可読性が低いという課題がありました。新しいメソッドを使用することで、より直感的かつ安全に不要な文字列を除去できます。
目次
メソッドの特徴
str.removeprefix(prefix): 文字列が指定したprefixで始まる場合、それを削除した新しい文字列を返します。一致しない場合は元の文字列をそのまま返します。str.removesuffix(suffix): 文字列が指定したsuffixで終わる場合、それを削除した新しい文字列を返します。一致しない場合は元の文字列をそのまま返します。
実装例:商品コードの正規化処理
以下は、データベースやAPIから取得した「プレフィックス(接頭辞)」と「サフィックス(接尾辞)」付きの商品コードを、純粋なID番号に正規化するコード例です。
def main():
# システム連携などで付与された装飾付きの商品コード
raw_product_code = "PROD_987654_v2"
print(f"処理前のコード: {raw_product_code}")
# 1. 先頭の 'PROD_' を削除する (removeprefix)
# 文字列が "PROD_" で始まっている場合のみ削除されます。
# Python 3.9未満では動作しないため注意が必要です。
code_step1 = raw_product_code.removeprefix("PROD_")
print(f"プレフィックス削除後: {code_step1}")
# 2. 末尾の '_v2' を削除する (removesuffix)
# 文字列が "_v2" で終わっている場合のみ削除されます。
clean_id = code_step1.removesuffix("_v2")
print(f"サフィックス削除後: {clean_id}")
# --- 補足: 一致しない場合の挙動 ---
# 指定した文字列が存在しない場合は、元の文字列がそのまま返されます。
no_change = raw_product_code.removeprefix("UNKNOWN_")
print(f"一致しない場合: {no_change}")
if __name__ == "__main__":
main()
注意点:lstrip / rstrip との違い
従来の lstrip() や rstrip() は「指定された文字セットのいずれか」を削除するメソッドです。特定の単語を削除する目的で使用すると、意図しない挙動を引き起こすことがあります。
誤った使用例(lstripの場合):
# "PROD_" という「文字列」ではなく、'P','R','O','D','_' の「文字」が削除される
text = "PROD_D001"
print(text.lstrip("PROD_"))
# 結果: "001" (期待値は "D001" だが、Dも削除されてしまう)
対して removeprefix は文字列全体が完全に一致した場合のみ削除を行うため、上記のような事故を防ぐことができます。Python 3.9以上の環境であれば、可読性と安全性の観点から removeprefix / removesuffix の使用が推奨されます。
