概要
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