- Python
Python文字列の置換と削除|replace・stripで空白と改行を消す
Pythonで文字列を置換するには replace()、両端の空白や改行を削除するには strip() を使います。 途中にある空白を消すなら replace(" ", "")、連続した空白を1個にそろえるなら " ".join(s.split())、パターンで置換するなら re.sub() と、消したい場所によって道具が変わります。
この記事では、「先頭・末尾・途中・連続・全角・改行」のどこを消したいかから書き方を引ける早見表を用意し、strip・replace・re.sub・translate・" ".join(s.split()) の結果を並べて比べます。あわせて、strip("abc") が単語ではなく「文字の集合」として働いて消しすぎる例を再現し、Python 3.9以降の removeprefix() / removesuffix() で直す流れも載せました。コードと出力は Python 3.11.15 で実行して確認したものです。
置換と削除の早見表
消したい場所から書き方を選べる一覧です。例の文字列は s = " Hello World "(前後に空白2個、途中に空白2個)で、結果の列はすべて実行して得た値です。
| 消したい場所 | 書き方 | 結果 |
|---|---|---|
| 先頭と末尾の空白 | s.strip() |
'Hello World' |
| 先頭だけ | s.lstrip() |
'Hello World ' |
| 末尾だけ | s.rstrip() |
' Hello World' |
| 途中も含めたすべての半角スペース | s.replace(" ", "") |
'HelloWorld' |
| 連続した空白を1個にし、前後も消す | " ".join(s.split()) |
'Hello World' |
| 連続した空白を1個にする(正規表現) | re.sub(r"\s+", " ", s).strip() |
'Hello World' |
| 全角スペースも含めたすべての空白類 | "".join(s.split()) |
'HelloWorld' |
| 行末の改行だけ | line.rstrip("\n") |
'abc\n' → 'abc' |
文字列中のすべての改行(\n と \r\n) |
"".join(t.splitlines()) |
'a\r\nb\n' → 'ab' |
| 先頭の決まった文字列(接頭辞) | s.removeprefix("img_") |
'img_01' → '01' |
| 末尾の決まった文字列(接尾辞) | s.removesuffix(".txt") |
'memo.txt' → 'memo' |
| 複数の文字をまとめて削除 | s.translate(str.maketrans("", "", "()-")) |
'(03)1234-5678' → '0312345678' |
| 文字列を別の文字列に置換 | s.replace("/", "-") |
'2026/10/03' → '2026-10-03' |
| パターンに合う部分を置換 | re.sub(r"\d+", "N", s) |
'id12 no345' → 'idN noN' |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Python文字列の置換と削除|replace・stripで空白と改行を消す」
置換と削除に使う5つの道具
最初に、それぞれの道具が「どこに」「何を」するのかを整理します。削除は「空文字に置換すること」と同じなので、置換の道具はそのまま削除にも使えます。
| 道具 | 対象になる場所 | 指定するもの | 向いている用途 |
|---|---|---|---|
strip / lstrip / rstrip |
両端・先頭・末尾 | 取り除く文字の集合(省略時は空白類) | 前後の空白や改行を落とす |
removeprefix / removesuffix |
先頭・末尾 | 取り除く文字列そのもの | 接頭辞・拡張子などを1回だけ外す |
replace |
文字列全体 | 置換前と置換後の文字列 | 決まった文字列の置換・削除 |
re.sub |
文字列全体 | 正規表現のパターン | 「数字の並び」「連続した空白」などパターンでの置換 |
translate |
文字列全体 | 1文字ごとの対応表 | 複数の文字を一度に置換・削除 |
どの道具も元の文字列を書き換えず、新しい文字列を返します。 Pythonの文字列は作ったあとに変更できない型だからです。結果を使うには、変数に代入し直します。
s = "abc"
s.replace("a", "Z") # 戻り値を受け取っていない
print(s)
s = s.replace("a", "Z") # 代入し直す
print(s)
実行結果:
abc
Zbc
「replaceしたのに変わらない」というときは、まずこの代入を確かめてみてください。
文字列を置換する:replaceの基本
replace(置換前, 置換後)ですべて置き換える
文字列.replace(old, new) は、見つかった old をすべて new に置き換えます。 new に空文字 "" を渡せば削除になります。
print("2026/10/03".replace("/", "-")) # 置換
print("a-b-c-d".replace("-", "")) # 削除(空文字に置換)
print("りんごとみかん".replace("みかん", "ぶどう"))
print("abc".replace("x", "y")) # 見つからなければ元のまま(エラーにならない)
実行結果:
2026-10-03
abcd
りんごとぶどう
abc
第3引数で置換する回数を決める
第3引数に回数を渡すと、先頭から数えてその回数だけ置換します。
s = "a-b-c-d"
print(s.replace("-", "+")) # すべて
print(s.replace("-", "+", 1)) # 最初の1個だけ
print(s.replace("-", "+", 2)) # 最初の2個だけ
実行結果:
a+b+c+d
a+b-c-d
a+b+c-d
末尾側から数えて置換したいときは、replaceに「後ろから」の指定がないため、rsplit と join を組み合わせます。
s = "a-b-c-d"
print("+".join(s.rsplit("-", 1))) # 最後の1個だけ置換
実行結果:
a-b-c+d
大文字と小文字は区別される
replaceは大文字と小文字を区別します。区別せずに置換したいときは、後述の re.sub に flags=re.IGNORECASE を付けます。
import re
s = "Apple apple APPLE"
print(s.replace("apple", "X"))
print(re.sub("apple", "X", s, flags=re.IGNORECASE))
実行結果:
Apple X APPLE
X X X
複数の置換を続けて書く
replaceは文字列を返すので、ドットでつなげて続けて書けます。置換の組が多いときは、辞書とfor文にまとめると見通しがよくなります。
s = "a.b,c!"
print(s.replace(".", "").replace(",", "").replace("!", ""))
table = {"春": "spring", "夏": "summer", "秋": "autumn"}
text = "春と夏と秋"
for old, new in table.items():
text = text.replace(old, new)
print(text)
実行結果:
abc
springとsummerとautumn
続けて置換するときは順番に注意します。前の置換の結果が、次の置換の対象になるためです。
s = "ab"
print(s.replace("a", "b").replace("b", "a")) # 入れ替えたつもりが、どちらも a になる
print(s.translate(str.maketrans("ab", "ba"))) # translate なら同時に置換できる
実行結果:
aa
ba
1文字どうしの入れ替えは、あとで紹介する translate が向いています。
前後の空白を消す:strip・lstrip・rstrip
引数なしのstrip()は空白類をまとめて落とす
strip() は文字列の両端から、lstrip() は先頭(左)から、rstrip() は末尾(右)から空白類を取り除きます。空白類には、半角スペース・タブ・改行・全角スペースが含まれます。
s = " Hello World "
print(repr(s.strip()))
print(repr(s.lstrip()))
print(repr(s.rstrip()))
print(repr(" \t\n x \n".strip())) # タブや改行もまとめて落ちる
実行結果:
'Hello World'
'Hello World '
' Hello World'
'x'
repr() は、文字列を引用符つきで表示する関数です。前後の空白や改行が残っているかを目で確かめやすくなるので、この記事では出力に使っています。
stripが触るのは両端だけです。 上の結果のとおり、Hello と World の間の空白2個はそのまま残ります。途中の空白を消す方法は、次の章で扱います。
| メソッド | 取り除く場所 | " Hello World " の結果 |
|---|---|---|
strip() |
両端 | 'Hello World' |
lstrip() |
先頭(left) | 'Hello World ' |
rstrip() |
末尾(right) | ' Hello World' |
引数で取り除く文字を指定する
引数に文字を渡すと、空白類の代わりにその文字を両端から取り除きます。
print("0012300".strip("0")) # 両端の 0
print("0012300".lstrip("0")) # 先頭の 0 だけ
print("「引用」".strip("「」")) # かっこを外す
print("--title--".strip("-"))
print(repr(" x ".strip("-"))) # 引数を渡すと空白は対象から外れる
実行結果:
123
12300
引用
title
' x '
最後の例のように、引数を渡した場合は、空白類が自動では取り除かれなくなります。 空白も一緒に落としたいときは strip("- ") のように空白を含めて指定します。
strip("abc")は「文字の集合」として働く
単語を消すつもりで消しすぎる例を再現する
stripの引数は、「この文字列を取り除く」ではなく「ここに含まれる文字を、端から続く限り取り除く」 という意味です。Python公式ドキュメントの str.strip の項にも、引数は接頭辞や接尾辞ではなく、含まれる文字の組み合わせがすべて取り除かれる、という説明があります。
この動きを知らずに「先頭の https:// を外そう」「末尾の .txt を外そう」とすると、意図より多く消えることがあります。
url = "https://staff.example.jp"
print(url.lstrip("https://")) # staff の s と t まで消える
filename = "test_data.txt"
print(filename.rstrip(".txt")) # この例はたまたま期待どおり
filename2 = "report_next.txt"
print(filename2.rstrip(".txt")) # next の x と t まで消える
print("img_img_01".lstrip("img_")) # 2回分とも消える
print("abcxyzcba".strip("abc")) # 順番に関係なく a, b, c が消える
実行結果:
aff.example.jp
test_data
report_ne
01
xyz
1つ目の例を追ってみます。lstrip("https://") は「h・t・p・s・コロン・スラッシュのどれかである限り、先頭から取り除く」という動きです。
| 先頭からの文字 | 集合 h t p s : / に含まれるか |
動き |
|---|---|---|
h t t p s : / / |
含まれる | 取り除く |
s(staff の1文字目) |
含まれる | 取り除く |
t(staff の2文字目) |
含まれる | 取り除く |
a(staff の3文字目) |
含まれない | ここで止まる |
その結果、staff.example.jp ではなく aff.example.jp が残ります。test_data.txt のように期待どおりになる入力もあるため、動作確認をすり抜けやすい点が、このつまずきの特徴です。
removeprefix・removesuffixで直す(Python 3.9以降)
「決まった文字列を、先頭または末尾から1回だけ外したい」ときは、Python 3.9で追加された removeprefix() と removesuffix() を使います。こちらは引数を文字列そのものとして扱います。
url = "https://staff.example.jp"
print(url.removeprefix("https://"))
filename2 = "report_next.txt"
print(filename2.removesuffix(".txt"))
print("img_img_01".removeprefix("img_")) # 外すのは1回だけ
print("report.csv".removesuffix(".txt")) # 一致しなければ元のまま
実行結果:
staff.example.jp
report_next
img_01
report.csv
| 比べる点 | strip / lstrip / rstrip |
removeprefix / removesuffix |
|---|---|---|
| 引数の意味 | 取り除く文字の集合 | 取り除く文字列そのもの |
| 取り除く回数 | 集合に含まれる文字が続く限り | 一致したら1回だけ |
| 一致しないとき | 元の文字列のまま | 元の文字列のまま |
| 使えるバージョン | すべて | Python 3.9以降 |
| 向いている用途 | 空白・改行・記号など「文字の種類」を落とす | 接頭辞・拡張子など「決まった文字列」を外す |
Python 3.8以前で同じことをする書き方
Python 3.8以前の環境では、startswith() / endswith() とスライスを組み合わせて同じ結果を得られます。
def remove_prefix(text, prefix):
return text[len(prefix):] if text.startswith(prefix) else text
def remove_suffix(text, suffix):
return text[:-len(suffix)] if suffix and text.endswith(suffix) else text
print(remove_prefix("https://staff.example.jp", "https://"))
print(remove_suffix("report_next.txt", ".txt"))
print(remove_suffix("report.csv", ".txt"))
実行結果:
staff.example.jp
report_next
report.csv
途中の空白・連続した空白を消す
すべての半角スペースを消す:replace
途中にある空白も含めてすべて消すなら、replace(" ", "") です。
s = " Hello World "
print(repr(s.replace(" ", "")))
実行結果:
'HelloWorld'
連続した空白を1個にそろえる:joinとsplit、またはre.sub
「単語の間の空白は1個残したい」ときは、引数なしの split() で単語に分け、半角スペースで join し直す方法が手軽です。split() は連続した空白を1つの区切りとして扱い、前後の空白も無視します。
import re
s = " Hello World "
print(repr(" ".join(s.split()))) # 連続を1個に、前後も消える
print(repr(re.sub(r"\s+", " ", s))) # 連続を1個に(前後に1個ずつ残る)
print(repr(re.sub(r"\s+", " ", s).strip())) # strip を足すと上と同じ結果
print(repr(re.sub(r" {2,}", " ", s))) # 半角スペース2個以上だけを対象にする
実行結果:
'Hello World'
' Hello World '
'Hello World'
' Hello World '
| 書き方 | 前後の空白 | 改行やタブ | 特徴 |
|---|---|---|---|
" ".join(s.split()) |
消える | 半角スペース1個になる | importなしで書ける |
re.sub(r"\s+", " ", s) |
1個ずつ残る | 半角スペース1個になる | stripと組み合わせて使う |
re.sub(r" {2,}", " ", s) |
1個ずつ残る | そのまま残る | 半角スペースだけを対象にできる |
全角スペースを消す
日本語の文章では、全角スペース()が混ざることがよくあります。引数なしの strip() と split() は全角スペースも空白類として扱いますが、strip(" ") や replace(" ", "") のように半角スペースを指定した場合は対象になりません。
次のコードでは、結果の前後が見えるように角かっこで囲んで表示しています。
import re
z = " 東京 都 " # 前後と途中に全角スペース
print("[" + z.strip() + "]") # 両端の全角スペースが消える
print("[" + z.strip(" ") + "]") # 半角スペース指定では消えない
print("[" + z.replace(" ", "") + "]") # 半角スペースの置換でも消えない
print("[" + z.replace(" ", "") + "]") # 全角スペースを指定すれば消える
print("[" + "".join(z.split()) + "]") # split と join なら半角・全角どちらも消える
print("[" + re.sub(r"\s", "", z) + "]") # 正規表現の \s も全角スペースに一致する
mixed = " 東京 都 大阪 府" # 半角と全角が混在
print("[" + mixed.replace(" ", "").replace(" ", "") + "]")
print("[" + " ".join(mixed.split()) + "]") # すべて半角スペース1個にそろえる
実行結果:
[東京 都]
[ 東京 都 ]
[ 東京 都 ]
[東京都]
[東京都]
[東京都]
[東京都大阪府]
[東京 都 大阪 府]
| 書き方 | 半角スペース | 全角スペース |
|---|---|---|
s.strip()(両端) |
消える | 消える |
s.strip(" ")(両端) |
消える | 残る |
s.replace(" ", "") |
消える | 残る |
s.replace(" ", "") |
残る | 消える |
"".join(s.split()) |
消える | 消える |
re.sub(r"\s", "", s) |
消える | 消える |
半角と全角が混ざっていそうな入力には、"".join(s.split()) か re.sub(r"\s", "", s) を選ぶと、種類を気にせずまとめて処理できます。
全角の英数字を半角にそろえたい場合は、標準ライブラリの unicodedata.normalize("NFKC", s) が使えます。全角スペースも半角スペースに変わります。
import unicodedata
print(unicodedata.normalize("NFKC", "ABC 123"))
実行結果:
ABC 123
改行を消す:\nと\r\nの両方に対応する
改行には、\n(LF)と \r\n(CRLF、Windowsで使われる形式)があります。\n だけを対象にすると \r が残ることがあるため、両方を意識して書くのがポイントです。
行末の改行を消す
ファイルから読み込んだ1行の末尾にある改行は、rstrip() で落とせます。
line1 = "apple\n"
line2 = "banana\r\n"
line3 = "cherry \n"
print(repr(line1.rstrip("\n")))
print(repr(line2.rstrip("\n"))) # \r が残る
print(repr(line2.rstrip("\r\n"))) # \r と \n の両方を指定
print(repr(line2.rstrip())) # 引数なしなら空白類をまとめて落とす
print(repr(line3.rstrip("\n"))) # 行末の空白は残したいとき
print(repr(line3.rstrip())) # 行末の空白も落としたいとき
print(repr("abc\n\n".rstrip("\n"))) # 続く改行をすべて落とす
print(repr("abc\n\n".removesuffix("\n"))) # 1個だけ落とす
実行結果:
'apple'
'banana\r'
'banana'
'banana'
'cherry '
'cherry'
'abc'
'abc\n'
| 行末で消したいもの | 書き方 |
|---|---|
| 改行だけ(行末の空白は残す) | line.rstrip("\r\n") |
| 改行と行末の空白 | line.rstrip() |
| 改行を1個だけ | line.removesuffix("\n") |
rstrip("\r\n") も「文字の集合」の指定なので、\r と \n のどちらが何個並んでいても取り除かれます。
文字列の中にあるすべての改行を消す
複数行の文字列から改行をすべて取り除く方法を比べます。
import re
t = "line1\r\nline2\nline3\r\n" # \r\n と \n が混在
print(repr(t.replace("\n", ""))) # \r が残る
print(repr(t.replace("\r\n", "").replace("\n", ""))) # 長いほうから順に置換
print(repr("".join(t.splitlines()))) # 行に分けてつなぐ
print(repr(" ".join(t.splitlines()))) # 改行を半角スペースに変える
print(repr(re.sub(r"\r?\n", "", t))) # 正規表現
print(repr(t.translate(str.maketrans("", "", "\r\n")))) # \r と \n を1文字ずつ削除
print(repr(t.replace("\r\n", "\n"))) # 改行コードを \n にそろえる
実行結果:
'line1\rline2line3\r'
'line1line2line3'
'line1line2line3'
'line1 line2 line3'
'line1line2line3'
'line1line2line3'
'line1\nline2\nline3\n'
| 書き方 | \n |
\r\n |
ひとこと |
|---|---|---|---|
t.replace("\n", "") |
消える | \r が残る |
\n だけのテキスト向き |
t.replace("\r\n", "").replace("\n", "") |
消える | 消える | 置換の順番がポイント |
"".join(t.splitlines()) |
消える | 消える | 改行の種類を意識せずに書ける |
re.sub(r"\r?\n", "", t) |
消える | 消える | 他のパターンと組み合わせやすい |
t.translate(str.maketrans("", "", "\r\n")) |
消える | 消える | 1文字単位でまとめて削除 |
改行の種類が混ざっているかもしれないテキストには、"".join(t.splitlines()) が書きやすい選択です。 改行を消すのではなく区切りに変えたいときは、" ".join(...) や ",".join(...) のように区切り文字を変えるだけで済みます。
ファイルの各行から改行と空行を取り除く
行のリストを整える処理は、内包表記と組み合わせると1行で書けます。
lines = [" apple \n", "\n", " banana\r\n", " \n", "cherry"]
print([line.strip() for line in lines]) # 各行の前後を整える
print([line.strip() for line in lines if line.strip()]) # 空行も除く
実行結果:
['apple', '', 'banana', '', 'cherry']
['apple', 'banana', 'cherry']
パターンで置換する:re.sub
「数字の並び」「2個以上続く空白」のように、決まった文字列ではなくパターンで指定したいときは、正規表現モジュールの re.sub(パターン, 置換後, 文字列) を使います。
import re
print(re.sub(r"\d+", "N", "id12 no345")) # 数字の並びを N に
print(re.sub(r"[^0-9]", "", "TEL: 03-1234-5678")) # 数字以外を削除
print(re.sub(r"[,.!?]", "", "Hello, World! OK?")) # 記号をまとめて削除
print(re.sub(r"(\d+)-(\d+)", r"\2-\1", "12-34")) # かっこで囲んだ部分を入れ替える
print(re.sub(r"\d+", lambda m: str(int(m[0]) * 2), "a1 b20")) # 関数で置換後を決める
print(re.sub(r"-", "+", "a-b-c-d", count=2)) # 置換する回数を決める
print(re.subn(r"\s+", " ", "a b c")) # 置換した回数も受け取る
print(re.sub(r"^ +", "", " a\n b\n c", flags=re.MULTILINE)) # 各行の行頭の空白を削除
実行結果:
idN noN
0312345678
Hello World OK
34-12
a2 b40
a+b+c-d
('a b c', 2)
a
b
c
| パターン | 意味 |
|---|---|
\d+ |
数字が1個以上続いたもの |
\s+ |
空白類(スペース・タブ・改行・全角スペース)が1個以上続いたもの |
[,.!?] |
角かっこ内のどれか1文字 |
[^0-9] |
0〜9以外の1文字(先頭の ^ は「以外」の意味) |
\r?\n |
\r があってもなくてもよい \n |
^ +(re.MULTILINE つき) |
各行の先頭にある1個以上の半角スペース |
置換後の文字列で \1、\2 と書くと、パターンの中で丸かっこで囲んだ部分を参照できます。パターンと置換後は、バックスラッシュがそのまま伝わるよう r"..."(raw文字列)で書くのが定番です。
決まった文字列の置換なら replace、パターンが必要になったら re.sub と使い分けると、コードが読みやすく保てます。
複数の文字をまとめて置換・削除する:translate
translate() は、1文字ごとの対応表に従って、複数の文字を一度に置換・削除します。対応表は str.maketrans() で作ります。
# 1) 削除だけ:第3引数に、消したい文字を並べる
print("(03) 1234-5678".translate(str.maketrans("", "", "()- ")))
# 2) 1文字ずつ置換:第1引数の各文字を、第2引数の同じ位置の文字に
print("abc123".translate(str.maketrans("abc123", "abc123")))
# 3) 辞書で指定:置換と削除を混ぜられる(値は複数文字でもよい)
table = str.maketrans({".": "", ",": " ", "&": " and "})
print("a.b,c&d".translate(table))
# 4) 句読点をまとめて削除
import string
print("Hello, World! (test)".translate(str.maketrans("", "", string.punctuation)))
実行結果:
0312345678
abc123
ab c and d
Hello World test
| maketransの書き方 | 意味 |
|---|---|
str.maketrans("abc", "xyz") |
a→x、b→y、c→z(同じ長さの文字列を渡す) |
str.maketrans("", "", "abc") |
a・b・c を削除 |
str.maketrans({"a": "x", "b": ""}) |
辞書で指定(キーは1文字、値は文字列。空文字なら削除) |
replaceを何回もつなげる書き方と比べると、文字数が多いときに短く書け、置換が同時に行われるため順番の影響を受けません。 対象が「1文字」ではなく「文字列」のときは、replaceや re.sub を選びます。
どれを使うかの判断表
ここまでの内容を、目的から選べる形にまとめます。
| 目的 | 選ぶもの | 例 |
|---|---|---|
| 前後の空白・改行を落とす | strip() |
s.strip() |
| 行末の改行だけ落とす | rstrip("\r\n") |
line.rstrip("\r\n") |
| 先頭・末尾の決まった文字列を外す | removeprefix / removesuffix |
s.removesuffix(".txt") |
| 決まった文字列を置換・削除する | replace |
s.replace("/", "-") |
| 連続した空白を1個にする | join と split |
" ".join(s.split()) |
| すべての空白類(全角含む)を消す | join と split |
"".join(s.split()) |
| すべての改行を消す | join と splitlines |
"".join(s.splitlines()) |
| 複数の文字を一度に置換・削除する | translate |
s.translate(str.maketrans("", "", "()-")) |
| パターンで置換する、大文字小文字を区別しない | re.sub |
re.sub(r"\d+", "N", s) |
そのまま使えるレシピ
入力された文字列を整える
前後の空白を落とし、途中の空白を1個にそろえ、全角英数字を半角にします。
import unicodedata
def clean(text):
text = unicodedata.normalize("NFKC", text) # 全角英数字・全角スペースを半角に
return " ".join(text.split()) # 空白をそろえる
print(repr(clean(" Python 3.14 入門 \n")))
実行結果:
'Python 3.14 入門'
電話番号や郵便番号から数字だけを取り出す
import re
for raw in ["03-1234-5678", "(03) 1234 5678", "〒100-0001"]:
print(re.sub(r"\D", "", raw)) # \D は「数字以外」
実行結果:
0312345678
0312345678
1000001
拡張子を付け替える
name = "report_next.txt"
print(name.removesuffix(".txt") + ".md")
from pathlib import Path
print(Path(name).with_suffix(".md")) # パスとして扱うなら pathlib
実行結果:
report_next.md
report_next.md
複数行テキストの各行を整えて、空行を除く
text = " 買い物 \r\n\r\n 掃除\n \n洗濯 \n"
cleaned = "\n".join(line.strip() for line in text.splitlines() if line.strip())
print(cleaned)
実行結果:
買い物
掃除
洗濯
囲んでいる引用符を外す
for s in ['"hello"', "'world'", '"a"b"']:
print(s.strip("\"'"))
実行結果:
hello
world
a"b
引用符を「文字の集合」として両端から落としています。途中の引用符は残ります。
つまずきやすいポイントとエラーの一覧
| 起きること | 原因 | 対処 |
|---|---|---|
| replaceしたのに文字列が変わらない | 戻り値を代入していない | s = s.replace(...) と代入し直す |
| stripで途中の空白が消えない | stripは両端だけが対象 | replace(" ", "") や " ".join(s.split()) を使う |
lstrip("https://") で消えすぎる |
引数は文字の集合として扱われる | removeprefix("https://") を使う |
| 全角スペースが残る | 半角スペースだけを指定している | "".join(s.split()) か replace(" ", "") |
改行を消したのに \r が残る |
\n だけを対象にした |
splitlines()、rstrip("\r\n")、re.sub(r"\r?\n", ...) |
TypeError: replace() argument 2 must be str, not int |
置換後に数値を渡した | str(値) で文字列にしてから渡す |
AttributeError: 'NoneType' object has no attribute 'strip' |
変数の中身がNoneだった | (s or "").strip() のように空文字に寄せる |
AttributeError: 'str' object has no attribute 'removeprefix' |
Python 3.8以前で実行した | startswithとスライスで書く(この環境は3.11のため未実行) |
TypeErrorとAttributeErrorは、次のコードで再現できます。
try:
"abc".replace("a", 1)
except TypeError as e:
print("TypeError:", e)
value = None
try:
value.strip()
except AttributeError as e:
print("AttributeError:", e)
print(repr((value or "").strip())) # None でも止まらない書き方
実行結果:
TypeError: replace() argument 2 must be str, not int
AttributeError: 'NoneType' object has no attribute 'strip'
''
よくある質問
Q. stripとreplaceはどう使い分けますか?
A. 消したい場所で選びます。前後(両端)だけなら strip()、途中も含めた文字列全体なら replace() です。strip() は途中の空白には触れず、replace(" ", "") は単語の間の空白も消します。
Q. strip("abc")で想定より多く消えるのはなぜですか?
A. stripの引数は「文字列」ではなく「取り除く文字の集合」だからです。a・b・c のどれかが端に続く限り取り除かれます。決まった文字列を外したいときは、Python 3.9以降の removeprefix() / removesuffix() を使います。
Q. 改行を削除する一番手軽な方法は?
A. 行末の改行だけなら line.rstrip("\r\n")、文字列全体の改行なら "".join(text.splitlines()) です。どちらも \n と \r\n の両方に対応します。
Q. 全角スペースも一緒に削除できますか?
A. 引数なしの strip() と split() は全角スペースも空白類として扱います。両端だけなら s.strip()、途中も含めるなら "".join(s.split())、1個の半角スペースにそろえるなら " ".join(s.split()) です。
まとめ
- 前後の空白や改行は
strip()、途中も含めるならreplace()。stripが触るのは両端だけ - 連続した空白は
" ".join(s.split())で1個にそろう。全角スペースやタブもまとめて処理できる - stripの引数は「文字の集合」。
lstrip("https://")はstaffの s と t まで取り除く - 決まった接頭辞・接尾辞は
removeprefix()/removesuffix()(Python 3.9以降)で1回だけ外す - 改行は
\nと\r\nの両方を意識する。rstrip("\r\n")と"".join(s.splitlines())が書きやすい - パターンでの置換は
re.sub、複数の文字を一度に扱うならtranslate - どの方法も元の文字列は変えない。結果は変数に代入し直す
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Python文字列の置換と削除|replace・stripで空白と改行を消す」
株式会社RJCでは、Pythonの文字列操作を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。