文字列から余計な空白や改行を取り除く処理は、入力の前処理やファイルの行処理などで必須です。
本記事ではPythonのstrip
、lstrip
、rstrip
の違いと正しい使い分けを、初心者の方にも分かりやすく、具体例とともに丁寧に解説します。
目的に合わない使い方をすると意図せず文字が消えるため、注意点もまとめて理解していきます。
Pythonのstrip/lstrip/rstripとは?(空白削除の基本)
デフォルトは前後の空白(スペース/タブ/改行)を削除
strip
、lstrip
、rstrip
は、引数なしで使うと空白文字(スペース、タブ、改行など)を削除します。
strip
は前後の両方、lstrip
は先頭のみ、rstrip
は末尾のみが対象です。
例(デフォルトの空白削除)
# 前後に空白(スペース、タブ、改行)を含む文字列
s = " \t hello world \n"
# repr()で見えない文字(改行・タブ)も確認できるようにする
print("orig :", repr(s))
print("strip:", repr(s.strip())) # 前後の空白を削除
print("lstrip:", repr(s.lstrip())) # 先頭の空白を削除
print("rstrip:", repr(s.rstrip())) # 末尾の空白を削除
orig : ' \t hello world \n'
strip: 'hello world'
lstrip: 'hello world \n'
rstrip: ' \t hello world'
ここでの空白は、スペース、タブ(\t
)、改行(\n
)などを含みます。
Unicodeの空白も対象です。
- 関連記事:文字列が数字/英字/空白か判定する
文字列内部の空白は削除しない
内部(単語間)の空白はそのまま残ります。
削除されるのはあくまで前後だけです。
例(内部の空白は残る)
s = " hello world "
print(repr(s.strip())) # 内部の3つのスペースは維持される
'hello world'
内部の空白を詰めたい場合はsplit
や正規表現を使う別アプローチが必要です(本記事では扱いません)。
- 関連記事:正規表現(re)入門
- 関連記事:文字列を分割・結合したい (split, join)
lstripは先頭のみ、rstripは末尾のみ
どちら側を削除したいかで使い分けます。
例(左右の違い)
s = "\n\n data \t"
print("lstrip:", repr(s.lstrip())) # 左側(先頭)だけ削除
print("rstrip:", repr(s.rstrip())) # 右側(末尾)だけ削除
lstrip: 'data \t'
rstrip: '\n\n data'
先頭か末尾かを正しく選ぶことが、意図しない削除を防ぐ第一歩です。
strip/lstrip/rstripの違いと使い分け
基本の使い分けを短くまとめると次の通りです。
メソッド | 対象 | デフォルトで削除するもの | 主な用途 |
---|---|---|---|
strip() | 前後 | 空白文字(スペース/タブ/改行など) | 入力データの前後トリム |
lstrip() | 先頭 | 同上 | 先頭側だけ整形 |
rstrip() | 末尾 | 同上 | 行末の改行や余白を除去 |
以降で実例を示します。
前後の空白をまとめて消す(strip)
フォーム入力やCSVのセル文字列など、とにかく前後の余計な空白をまとめて取りたいときはstrip()
を使います。
例(フォーム入力のトリム)
raw = " Alice "
name = raw.strip() # 前後の空白を除去
print(repr(name))
'Alice'
- 関連記事:文字列と数値の型を変換したい
行末の改行だけ消す(rstrip(“\n”))
行単位の処理では、末尾の改行だけを確実に取り除くのが基本です。
引数なしのrstrip()
はスペースやタブも消えてしまうため、rstrip("\n")
のように改行だけを明示します。
例(改行のみ削除)
line = "value\twith\tspaces and tabs\n"
print("raw:", repr(line))
print("rstrip():", repr(line.rstrip())) # 末尾のタブ/スペースも消える
print('rstrip("\\n"):', repr(line.rstrip("\n"))) # 改行だけ消える
raw: 'value\twith\tspaces and tabs\n'
rstrip(): 'value\twith\tspaces and tabs'
rstrip("\n"): 'value\twith\tspaces and tabs'
最初のrstrip()
は改行に加えて末尾の空白も削除します。
末尾の空白を保持したいならrstrip("\n")
が安全です。
- 関連記事:テキストファイルを読み込む方法
- 関連記事:with構文でファイルを安全に開く方法
末尾の空白やカンマを整える(rstrip(“, “))
CSV風の出力で最後に余分なカンマやスペースが付く場合、rstrip(", ")
で後ろに並んだカンマやスペースをまとめて落とせます。
例(末尾の区切りを整形)
s = "apple, banana, cherry, "
print("before:", repr(s))
print("after :", repr(s.rstrip(", "))) # 末尾に連なる','と' 'をすべて除去
before: 'apple, banana, cherry, '
after : 'apple, banana, cherry'
rstrip(", ")
は末尾に連なっている間は何個でも削除します。
末尾が”, , , “のようになっていても全部消えます。
先頭の記号や余白を除去(lstrip)
ログやプロンプト記号など、行頭に特定記号や余白が付くときはlstrip()
が有効です。
例(行頭の記号を落とす)
line = ">>> result = 42"
clean = line.lstrip(" >") # ' 'と'>'のいずれかが続く限り削除
print(repr(clean))
'result = 42'
文字指定のstripの挙動と注意点
引数は文字集合として扱われる(並びは無関係)
引数は「文字集合」として扱われ、並び順やまとまりは意味を持ちません。
端から見て、その集合に含まれる文字である限り連続して削除されます。
例(集合としての削除)
s = "abcXYZcba"
print(s.strip("abc")) # 'a','b','c'のいずれかを端から除去
XYZ
ここでは「abc」という並びを消すのではなく、{'a', 'b', 'c'}
の文字が端にある限り落とされます。
空白以外の不要文字も削除(strip(“0/”))
ゼロやスラッシュなど、空白以外の端の不要文字も指定できます。
例(ゼロとスラッシュを落とす)
s = "0001/02/03///"
print(repr(s.strip("0/"))) # 端の'0'と'/'を削除
print(repr(s.lstrip("0/"))) # 左側だけ
print(repr(s.rstrip("0/"))) # 右側だけ
'1/02/03'
'1/02/03///'
'0001/02/03'
注意: 端にある限り指定した文字は何文字でも削除されます。
正規表現ではない(パターンは使えない)
正規表現パターンは使えません。
strip(r"\d")
のように書いても数字を意味せず、''
と'd'
という2文字の集合になります。
例(正規表現ではない)
s = r"\d123d"
print(repr(s.strip(r"\d"))) # '\' と 'd' を端から削除するだけ
'123d\'
正規表現で端のパターンを削除したい場合はre.sub()
など別手段を使います(本記事では割愛します)。
片側だけ削除する場合の指定(lstrip(chars)/rstrip(chars))
左側だけ、右側だけに対しても、同様に文字集合を渡せます。
例(片側の不要記号を削る)
s = "...Hello world!!!"
left_clean = s.lstrip(".") # 左の'.'だけ落とす
right_clean = s.rstrip("!?.") # 右の'!','?','.'だけ落とす
print(repr(left_clean))
print(repr(right_clean))
'Hello world!!!'
'...Hello world'
誤用注意: 例えばURLから"https://"
を消す目的でlstrip("https:/")
とすると、集合として扱われるため想定外の文字まで落ちる可能性があります。
removeprefix("https://")
の方が安全です。
よくある失敗と対策(空白削除)
特定の語を消したいならstripは不適(前後の文字集合しか削除しない)
特定の単語や接頭辞を消したいのにstrip
を使うのは不適切です。
strip("prefix_")
は{'p','r','e','f','i','x','_'}
の集合として処理され、両端のそれらの文字をすべて落とすだけです。
例(誤用と正しい代替)
s = "prefix_title_suffix"
print(s.strip("prefix_")) # 誤用: 端の文字集合を削るだけ。末尾も条件に合う文字が削れてしまう
# 正しい代替(接頭辞と接尾辞を語として扱う)
print(s.removeprefix("prefix_")) # Python 3.9+
print(s.removesuffix("_suffix")) # Python 3.9+
# 語の内部を置換したいならreplace
print(s.replace("prefix_", "")) # 必要に応じて
title_su
title_suffix
prefix_title
title_suffix
「語としての削除」はremoveprefix
/removesuffix
やreplace
を選びます。
改行は\r\nの両方を考慮する(rstrip(“\r\n”))
Windowsのテキストは\r\n
で終わることが多く、rstrip("\n")
だけだと\r
が残る場合があります。
rstrip("\r\n")
で両方に対応します。
例(Windows改行の処理)
win_line = "hello\r\n"
print(repr(win_line.rstrip("\n"))) # '\r'が残る
print(repr(win_line.rstrip("\r\n"))) # 両方消える
'hello\r'
'hello'
ファイルの1行処理はline.rstrip(“\n”)が基本
ファイルからの各行処理では末尾の改行だけを確実に落とし、行末の空白は保持したいことが多いためrstrip("\n")
が基本です。
Windowsも考慮するならrstrip("\r\n")
が堅実です。
例(行ごとの読み取りと整形)
# 実ファイルがない環境向けのデモ用: 行のリストを仮定
lines = ["alpha \n", "beta\t\n", "gamma\r\n"]
print([line.rstrip("\n") for line in lines]) # 改行のみ除去
print([line.rstrip("\r\n") for line in lines]) # Windowsも考慮
['alpha ', 'beta\t', 'gamma\r']
['alpha ', 'beta\t', 'gamma']
目的に応じてどちらを使うか選びます。
数値文字列の先頭0をstripすると末尾0も消える
よくある落とし穴として、先頭の0だけ落としたいのにstrip("0")
を使うと、末尾の0も消えてしまいます。
左側だけならlstrip("0")
を使います。
例(先頭ゼロの除去)
s = "0012300"
print(s.strip("0")) # 両端の'0'を削除 → 末尾の0も消える
print(s.lstrip("0")) # 左側の'0'だけ削除
print(int(s)) # 数値化してしまうのも手(ただし空文字や非数字は例外)
'123'
'12300'
12300
数値として扱うなら型変換int()
が確実です。
ただし空文字や非数字は例外になる点に注意します。
まとめ
strip系は「端から文字集合を削る」道具です。
引数なしなら空白全般、引数ありなら指定した文字の集合を、strip
は前後、lstrip
は先頭、rstrip
は末尾から削除します。
内部の空白は対象外で、正規表現は使えません。
行処理ではrstrip("\n")
やrstrip("\r\n")
を使い、接頭辞・接尾辞を語として扱う場合はremoveprefix
/removesuffix
を選ぶと安全です。
「文字集合」になる性質を意識すれば、意図しない文字消失を防げます。
- 関連記事:replaceで文字列を置換する