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期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?