概要
Pythonで文字列を削除するときにちょっとはまったので備忘のため記載
rstrip
,lstrip
を何気なく使っているとはまるかもしれません。
現象
以下のようにファイル名の接頭辞または接尾辞を削除するときについlstrip
またはrstrip
を使いたくなってしまうかもしれません。
fileName='test_出力ファイル_20191217_001.xlsx'
# 接頭辞を削除
print(fileName.lstrip('test_'))
# 出力ファイル_20191217_001.xlsx
# 接尾辞を削除
print(fileName.rstrip('.xlsx'))
# test_出力ファイル_20191217_001
出力結果としては問題なさそうですがここで文字列が以下のような場合に問題が発生します。
fileName='test_est_出力ファイル_20191217_001xsls.xlsx'
# 接頭辞を削除
print(fileName.lstrip('test_'))
# 出力ファイル_20191217_001xsls.xlsx
# 接尾辞を削除
print(fileName.rstrip('.xlsx'))
# test_est_出力ファイル_20191217_001
test_
だけまたは.xlsx
だけが消えてほしいのにほかの文字も消えてしまっています。
原因はlstrip
またはrstrip
で削除するのは指定した文字列と一致するものを削除しているためです。
接頭辞で消しているパターンの場合 test_
のいずれかの文字を削除しています。
接尾辞の場合は .xlsx
のいずれかを削除しています。
こういったときに接頭辞または接尾辞を削除したいときは
re
を使って正規表現で削除するのがよさそうです。
例の場合ですと
import re
fileName='test_出力ファイル_20191217_001.xlsx'
# 接頭辞を削除
print(re.sub("^test_", "", fileName))
# 出力ファイル_20191217_001.xlsx
# 接尾辞を削除
print(re.sub(".xlsx$", "", fileName))
# test_出力ファイル_20191217_001
としっかりと接頭辞または接尾辞を削除できます。
以下のようにlstrip
またはrstrip
でうまくいかなかった例もうまくいきます。
import re
fileName='test_est_出力ファイル_20191217_001xsls.xlsx'
# 接頭辞を削除
print(re.sub("^test_", "", fileName))
# est_出力ファイル_20191217_001xsls.xlsx
# 接尾辞を削除
print(re.sub(".xlsx$", "", fileName))
# test_est_出力ファイル_20191217_001xsls