パイソン 文字列からプレフィックスとサフィックスを取り除く

Python で文字列からホワイトスペースやその他の文字を取り除くには、複数の方法があります。

最もよく知られているのは strip()lstrip()rstrip() です。

Pythonバージョン3.9以降、文字列のプリフィックスやサフィックスを削除するための、非常に期待される2つのメソッドが導入されました。

それは removeprefix()removesuffix() です。

このガイドでは、これらのメソッドの使い方と、なぜこれらが便利なのかを簡単に説明します。

また、 startswith()endswith() メソッドの助けを借りて、Python 3.9 よりも低いバージョンのプレフィックスとサフィックスを削除する方法を紹介します。

strip()lstrip()rstrip()についてもっと知りたい方は、 Python’s strip() Method and its variants をご覧ください。

strip() メソッドを使用しない理由

プレフィックスやサフィックスを取り除くために lstrip()rstrip() メソッドを使うのはどうなんだろう、と思うかもしれません。

しかし、これらのメソッドを使用すると、最初または最後の出現箇所のみを削除するのではなく、テキスト全体を削除してしまう可能性があります。

例えば、よくあるパターンの文字列で接頭辞の削除を試してみましょう。

line = "xyyyxyxyxy"
print(line.lstrip("xy"))


このコードは、文字列のペアである「xy」を任意の順序で左から順に削除する。

入力文字列には “xy “のペアしか含まれていないので、テキスト全体が取り除かれることになる。

$ python strip_test.py
$


もし、最初か最後のn文字だけを削除する必要があるなら、 strip() メソッドは役に立ちません。

この要件はPythonコミュニティでは一般的であり、その答えとして removeprefix()removesuffix() メソッドが追加されたのです。

Pythonのバージョン (< 3.9 または 3.9) に応じて、文字列からプレフィックスやサフィックスを削除する方法は2つあります。

Python バージョン = 3.9 でのプレフィックス/サフィックスの除去

Python バージョン 3.9 以降では、 removeprefix()removesuffix() メソッドが名前空間の組み込みメソッドとして用意されており、文字列からプレフィックスとサフィックスを削除するために使用されます。

先ほどのようなパターン化された文字列を考えてみましょう。

line = "xy"*5+" | "+"yz"*5
prefix = "xy"
line_new = line.removeprefix(prefix)
print("Before: ", line, line.count(prefix))
print("After:    ", line_new, line_new.count(prefix))


このコードは、最初の文字列の接頭辞 “xy” を取り除き、両方の行について接頭辞の出現回数を最後に表示します。

このコードを実行してみよう。

$ python remove_prefix.py
Before:  xyxyxyxyxy | yzyzyzyzyz 5
After:     xyxyxyxy | yzyzyzyzyz 4


同様に、接尾辞も removesuffix() メソッドを使って削除することができます。

line = "xy"*5+" | "+"yz"*5
suffix = "yz"
line_new = line.removesuffix(suffix)
print("Before: ", line, line.count(suffix))
print("After:  ", line_new, line_new.count(suffix))


このコードを実行すると、次のようになります。

$ python remove_suffix.py
Before:  xyxyxyxyxy | yzyzyzyzyz 5
After:   xyxyxyxyxy | yzyzyzyz 4


Python バージョン < 3.9 における接頭辞/接尾辞の除去

Python 3.9 未満のバージョンでは、この問題は startswith()endswith() メソッドの組み合わせと、文字列のスライスを使うことで間接的に解決することができます。

これは、プレフィックス/サフィックスが存在するかどうかを検証し、対応するセグメントを文字列から切り取ることができるようにするものです。

以下は、文字列からプレフィックスを簡単に取り除く方法です。

line = "xy"*5+" | "+"yz"*5
prefix = "xy"

if line.startswith(prefix):
    line_new = line[len(prefix):]

print("Before: ", line, line.count(prefix))
print("After:    ", line_new, line_new.count(prefix))


プレフィックスが存在することを確認したら、プレフィックス以外を含むように文字列をスライスし、その結果を返します。

この結果、文字列から接頭辞 “xy “が取り除かれ、次のような出力が得られます。

$ python remove_prefix_alt.py
Before:  xyxyxyxyxy | yzyzyzyzyz 5
After:     xyxyxyxy | yzyzyzyzyz 4


接尾辞を取り除くには、スライス記法のパラメータの順番を調整して、文字列の末尾から順に並べればよい。

line = "xy"*5+" | "+"yz"*5
suffix = "yz"

if line.endswith(suffix):
   line_new = line[:-len(suffix)]

print("Before: ", line, line.count(suffix))
print("After:  ", line_new, line_new.count(suffix))


ここでも、まず endswith() メソッドを使って行を検証し、サフィックスが存在するかどうかを確認する。

もしそれが本当なら、サフィックスが文字列から取り除かれます。

$ python remove_suffix_alt.py
Before:  xyxyxyxyxy | yzyzyzyzyz 5
After:   xyxyxyxyxy | yzyzyzyz 4


結論

プレフィックスやサフィックスを除去することは、テキスト処理を行う上で非常に有用です。

Python v3.9+ では、これを可能にするために removeprefix()removesuffix() という2つの新しい関数が提供されています。

Python 3.9未満のバージョンを使っている場合は、文字列のスライスと一緒に startswith()endswith() メソッドを使うことで、それぞれプレフィックスとサフィックスを取り除くことができます。

タイトルとURLをコピーしました