Pythonで文字列の一部を削除(stripなど) - nkmk note
文章推薦指數: 80 %
改行 \n や全角スペース \u3000 やタブ \t などが空白文字とみなされ削除される。
print() の出力だと分かりにくいが、元の文字列には c のあとに全角 ...
Top
Python
Pythonで文字列の一部を削除(stripなど)
Posted:2020-04-01/Modified:2021-01-02/Tags:Python,文字列処理,正規表現
Tweet
Pythonで、文字列strの一部を削除(除去)する方法について、以下の内容を説明する。
任意の文字列を空文字列に置換して削除
完全一致する文字列を削除:replace()
正規表現にマッチする文字列を削除:re.sub()
両端(先頭、末尾)の文字を削除:strip()
先頭(左側)の文字を削除:lstrip()
末尾(右側)の文字を削除:rstrip()
プレフィックスを削除:removeprefix()(Python3.9以降)
サフィックスを削除:removesuffix()(Python3.9以降)
文字列の位置・文字数を指定して削除:スライス
文字列を要素とするリストの場合
改行を含む文字列の場合
各行の文字列の一部を削除
条件に応じて行を削除
拡張子の削除やディレクトリ部分の削除(ファイル名のみ抽出)など、パス文字列の処理については以下の記事を参照。
関連記事:Pythonでパス文字列からファイル名・フォルダ名・拡張子を取得、結合
テキストファイルの中身の一部を削除したい場合は、open()で文字列として読み込んでから以降で説明する方法で処理して、再度open()で保存すればよい。
関連記事:Pythonでファイルの読み込み、書き込み(作成・追記)
スポンサーリンク
任意の文字列を空文字列に置換して削除
文字列中の任意の文字列を削除したい場合、対象の文字列を空文字列''に置換する。
ここでは、replace()とre.sub()の簡単な例のみを示す。
置換についてのより詳しい内容は以下の記事を参照。
複数の文字を置換するtranslate()などもある。
関連記事:Pythonで文字列を置換(replace,translate,re.sub,re.subn)
完全一致する文字列を削除:replace()
文字列strのreplace()メソッドで、指定した文字列に完全一致する文字列を置換できる。
空文字列''に置換すると削除される。
s='abc-xyz-123-789-ABC-XYZ'
print(s.replace('xyz',''))
#abc--123-789-ABC-XYZ
source:str_replace_with_empty.py
正規表現にマッチする文字列を削除:re.sub()
正規表現にマッチする文字列を削除したい場合は正規表現モジュールreのsub()を使う。
ここで、\d+は1文字以上の数字の並びにマッチする正規表現パターン。
123や789が空文字列''に置換され、削除される。
importre
s='abc-xyz-123-789-ABC-XYZ'
print(re.sub('\d+','',s))
#abc-xyz---ABC-XYZ
source:str_replace_with_empty.py
両端(先頭、末尾)の文字を削除:strip()
文字列の両端(先頭、末尾)の指定した文字を削除するにはstrip()を使う。
組み込み型-str.strip()—Python3.8.2ドキュメント
デフォルトでは両端の連続する空白文字が取り除かれる。
改行\nや全角スペース\u3000やタブ\tなどが空白文字とみなされ削除される。
print()の出力だと分かりにくいが、元の文字列にはcのあとに全角スペースがある。
s='\nabc \t'
print(s)
#
#abc
print(repr(s))
#'\nabc\u3000\t'
print(s.strip())
#abc
print(repr(s.strip()))
#'abc'
source:str_strip_lstrip_rstrip.py
ここでは、末尾の全角スペースやタブを分かりやすくするため組み込み関数repr()を使っている。
組み込み関数-repr()—Python3.8.2ドキュメント
文字列メソッドは新たなオブジェクトを返すので、元のオブジェクトはそのまま。
元の変数に代入して上書きすることはできる。
replace()や以降のlstrip()やrstrip()でも同様。
s_strip=s.strip()
print(repr(s_strip))
#'abc'
print(repr(s))
#'\nabc\u3000\t'
s=s.strip()
print(repr(s))
#'abc'
source:str_strip_lstrip_rstrip.py
引数に文字列を指定すると、その文字列に含まれる文字が両端から削除される。
指定した文字列に一致する文字列ではなく、指定した文字列に含まれる文字が削除される。
例えば'abc'でも'cba'でも結果は同じ。
間違えやすいので注意。
一致した文字列を削除したい場合は、後述のremoveprefix(),removesuffix()を使う。
s='aabbcc-abc-aabbcc'
print(s.strip('abc'))
#-abc-
print(s.strip('cba'))
#-abc-
print(s.strip('ab'))
#cc-abc-aabbcc
source:str_strip_lstrip_rstrip.py
引数に文字列を指定した場合は空白文字は削除されない。
s='\naabbcc-abc-aabbcc \t'
print(repr(s))
#'\naabbcc-abc-aabbcc\u3000\t'
print(repr(s.strip('abc')))
#'\naabbcc-abc-aabbcc\u3000\t'
source:str_strip_lstrip_rstrip.py
空白文字も取り除きたい場合は、明示的に指定するか、strip()を繰り返し適用する必要がある。
print(repr(s.strip('abc\n \t')))
#'-abc-'
print(repr(s.strip().strip('abc')))
#'-abc-'
source:str_strip_lstrip_rstrip.py
先頭・末尾の文字数を指定して削除したい場合は後述のスライスを使う。
先頭(左側)の文字を削除:lstrip()
strip()は両端が対象だが、先頭のみを処理したい場合はlstrip()を使う。
lは左側leftのl。
組み込み型-str.lstrip()—Python3.8.2ドキュメント
使い方はstrip()と同じ。
s='\nabc \t'
print(repr(s.lstrip()))
#'abc\u3000\t'
s='aabbcc-abc-aabbcc'
print(s.lstrip('abc'))
#-abc-aabbcc
source:str_strip_lstrip_rstrip.py
末尾(右側)の文字を削除:rstrip()
末尾のみを処理したい場合はrstrip()を使う。
rは右側rightのr。
組み込み型-str.rstrip()—Python3.8.2ドキュメント
使い方はstrip()と同じ。
s='\nabc \t'
print(repr(s.rstrip()))
#'\nabc'
s='aabbcc-abc-aabbcc'
print(s.rstrip('abc'))
#aabbcc-abc-
source:str_strip_lstrip_rstrip.py
プレフィックスを削除:removeprefix()(Python3.9以降)
Python3.9から、プレフィックス(先頭の特定文字列)を削除するメソッドremoveprefix()が追加された。
組み込み型-str.removeprefix()—Python3.9.1ドキュメント
引数に指定したプレフィックスから始まる場合、プレフィックスが削除された文字列が返される。
一致しない場合は元の文字列がそのまま返される。
s='abc-abcxyz'
print(s.removeprefix('abc-'))
#abcxyz
print(s.removeprefix('aabc-'))
#abc-abcxyz
source:str_removeprefix_removesuffix.py
上述のlstrip()だと、引数に指定した文字列に含まれる文字がすべて削除されるので、プレフィックスのみを削除したいという用途には向かない。
print(s.lstrip('abc-'))
#xyz
source:str_removeprefix_removesuffix.py
Python3.9より前のバージョンで同様の処理を実行したい場合、例えば以下のような関数が考えられる。
defmy_removeprefix(s,prefix):
ifs.startswith(prefix):
returns[len(prefix):]
else:
returns
print(my_removeprefix(s,'abc-'))
#abcxyz
source:str_removeprefix_removesuffix.py
この関数は三項演算子を使って書くこともできる。
その例は次のremovesuffix()で示す。
スライスを利用して文字数で文字列を削除する方法については後述。
サフィックスを削除:removesuffix()(Python3.9以降)
Python3.9から、サフィックス(末尾の特定文字列)を削除するメソッドremovesuffix()が追加された。
組み込み型-str.removesuffix()—Python3.9.1ドキュメント
考え方はremoveprefix()と同じ。
s='abcxyz-xyz'
print(s.removesuffix('-xyz'))
#abcxyz
print(s.removesuffix('-xyzz'))
#abcxyz-xyz
source:str_removeprefix_removesuffix.py
Python3.9より前のバージョンで同様の処理を実行したい場合、例えば以下のような関数が考えられる。
三項演算子を用いている。
関連記事:Pythonの三項演算子(条件演算子)でif文を一行で書く
defmy_removesuffix(s,suffix):
returns[:-len(suffix)]ifs.endswith(suffix)elses
print(my_removesuffix(s,'-xyz'))
#abcxyz
source:str_removeprefix_removesuffix.py
プレフィックスとサフィックスを両方とも削除したい場合は、removeprefix()とremovesuffix()を続けて実行すればよい。
s='abc-abcxyz-xyz'
print(s.removeprefix('abc-').removesuffix('-xyz'))
#abcxyz
print(my_removeprefix(my_removesuffix(s,'-xyz'),'abc-'))
#abcxyz
source:str_removeprefix_removesuffix.py
文字列の位置・文字数を指定して削除:スライス
スライスを使うと位置(0始まり)を指定して文字列の一部を取得できる。
関連記事:Pythonのスライスによるリストや文字列の部分選択・代入
負の値で後ろから位置を指定したり、省略して先頭から末尾まで指定したりすることもできる。
s='0123456789'
print(s[3:7])
#3456
print(s[3:-3])
#3456
print(s[:5])
#01234
print(s[5:])
#56789
source:str_remove_slice.py
文字列の両端を削除したい場合は、上の例のように残す部分の位置をスライスで指定すればよい。
例えば、6文字目以降を削除するという処理は、5文字目までを取得するという処理に等しい。
内側の文字列を削除したい場合は、両端から残す部分をスライスで取得して+演算子で連結する。
関連記事:Pythonで文字列を連結・結合(+演算子、joinなど)
print(s[:3]+s[6:])
#0126789
source:str_remove_slice.py
例えば、以下のように関数化できる。
start文字目からend文字目まで(endも含む)の文字列を削除する関数。
defremove_str_start_end(s,start,end):
returns[:start]+s[end+1:]
print(remove_str_start_end(s,3,5))
#0126789
source:str_remove_slice.py
start文字目から文字数lengthの文字列を削除する関数。
defremove_str_start_length(s,start,length):
returns[:start]+s[start+length:]
print(remove_str_start_length(s,3,5))
#01289
source:str_remove_slice.py
文字列を要素とするリストの場合
リストに含まれる文字列を処理したい場合はリスト内包表記を利用して、要素ごとにstrip()などの文字列メソッドやスライスを適用する。
関連記事:Pythonリスト内包表記の使い方
l=['Alice','Bob','Charlie']
print([s.strip('bce')forsinl])
#['Ali','Bo','Charli']
print([s[:2]forsinl])
#['Al','Bo','Ch']
source:str_remove_list_line_break.py
改行を含む文字列の場合
以下のような改行を含む文字列を例とする。
s='Alice\nBob\nCharlie'
print(s)
#Alice
#Bob
#Charlie
source:str_remove_list_line_break.py
Pythonにおける改行についての詳細は以下の記事を参照。
改行コード自体の削除や置換についても触れている。
関連記事:Pythonで改行を含む文字列の出力、連結、分割、削除、置換
各行の文字列の一部を削除
改行を含む文字列の各行の一部を削除する場合、replace()などの文字列全体に対して作用するメソッドは特に気にせず使える。
print(s.replace('li',''))
#Ace
#Bob
#Chare
source:str_remove_list_line_break.py
一方、strip()などの両端を処理するメソッドは、当然ながら、以下のように全体の先頭・末尾に対する処理となる。
print(s.strip('bce'))
#Alice
#Bob
#Charli
source:str_remove_list_line_break.py
スライスも全体の位置に対して処理される。
print(s[2:-2])
#ice
#Bob
#Charl
source:str_remove_list_line_break.py
各行をそれぞれ処理するには、まずsplitlines()で行ごとに分割する。
関連記事:Pythonで文字列を分割(区切り文字、改行、正規表現、文字数)
l_s=s.splitlines()
print(l_s)
#['Alice','Bob','Charlie']
source:str_remove_list_line_break.py
このリストに対してリスト内包表記を用いて、各行を処理する。
l_s_strip=[line.strip('bce')forlineinl_s]
print(l_s_strip)
#['Ali','Bo','Charli']
source:str_remove_list_line_break.py
join()で一つの文字列に連結する。
関連記事:Pythonで文字列を連結・結合(+演算子、joinなど)
s_line_strip='\n'.join(l_s_strip)
print(s_line_strip)
#Ali
#Bo
#Charli
source:str_remove_list_line_break.py
まとめて書くこともできる。
以下は各行にスライスを使う例。
print('\n'.join([line[:2]forlineins.splitlines()]))
#Al
#Bo
#Ch
source:str_remove_list_line_break.py
条件に応じて行を削除
条件を満たす、あるいは、条件を満たさない行を削除するには、リスト内包表記に条件を加える。
関連記事:Pythonリスト内包表記の使い方
l_remove=[lineforlineins.splitlines()ifnotline.startswith('B')]
print(l_remove)
#['Alice','Charlie']
source:str_remove_list_line_break.py
そのあと、join()で一つの文字列に連結する。
s_line_remove='\n'.join(l_remove)
print(s_line_remove)
#Alice
#Charlie
source:str_remove_list_line_break.py
まとめて書いてもよい。
print('\n'.join([lineforlineins.splitlines()if'li'inline]))
#Alice
#Charlie
source:str_remove_list_line_break.py
上の例のように、startswith()やendswith()で前方一致・後方一致を判定したり、in演算子で部分一致を判定したりできるほか、re.search()で正規表現パターンにマッチするかを判定することなどもできる。
詳細は以下の記事を参照。
関連記事:Pythonで文字列を比較(完全一致、部分一致、大小関係など)
スポンサーリンク
シェア
Tweet
関連カテゴリー
Python
文字列処理
正規表現
関連記事
Pythonの正規表現モジュールreの使い方(match,search,subなど)
Pythonで文字列を分割(区切り文字、改行、正規表現、文字数)
Pythonで文字列を置換(replace,translate,re.sub,re.subn)
Pythonで文字列を比較(完全一致、部分一致、大小関係など)
Pythonで文字列を抽出(位置・文字数、正規表現)
Pythonの正規表現マッチオブジェクトでマッチした文字列や位置を取得
Pythonで文字列を検索(〜を含むか判定、位置取得、カウント)
Pythonの正規表現で漢字・ひらがな・カタカナ・英数字を判定・抽出・カウント
Pythonで長い文字列を複数行に分けて書く
PythonでUnicodeエスケープされた文字列・バイト列を変換
Pythonで文字列を連結・結合(+演算子、joinなど)
Pythonで文字列の長さ(文字数)を取得
PythonでMarkdownファイルからリンクのURLとアンカーテキストを抽出
Pythonでリストや文字列を逆順に並べ替え(reverse,reversed)
Python,formatで書式変換(0埋め、指数表記、16進数など)
サイト内検索
カテゴリー
Python
BeautifulSoup
Keras
Matplotlib
NumPy
OpenCV
pandas
Pillow
pip
PyDrive
PyTorch
Requests
scikit-image
scikit-learn
SciPy
Scrapy
seaborn
SymPy
TensorFlow
C#
Git
JupyterNotebook
Mac
アルゴリズム
スクレイピング
画像処理
機械学習文字列処理正規表現
Unicode
ファイル処理
日時処理
時系列データ
自動化
本・書籍
算数・数学
辞書
リスト
CSV
Excel
JSON
PDF
WebAPI
エラー
まとめ
About
Twitter
GitHub
Kaggle
スポンサーリンク
関連記事
Pythonの正規表現モジュールreの使い方(match,search,subなど)
Pythonで文字列を分割(区切り文字、改行、正規表現、文字数)
Pythonで文字列を置換(replace,translate,re.sub,re.subn)
Pythonで文字列を比較(完全一致、部分一致、大小関係など)
Pythonで文字列を抽出(位置・文字数、正規表現)
おすすめ本
みんなのPython第4版
Pythonデータサイエンスハンドブック
Pythonによるデータ分析入門第2版
Pythonではじめる機械学習
ディジタル画像処理改訂新版
スポンサーリンク
延伸文章資訊
- 1[Python]スクレイピングで取得した文字列から特定文字を削除 ...
これは全角空白がある時に表示されるのですが、これを削除する時には以下のようなコードになります。 str = "abc\u3000defg" str.replace('\u3000', '') >...
- 2U3000 python 削除在PTT/Dcard完整相關資訊 - 萌寵公園
提供U3000 python 削除相關PTT/Dcard文章,想要了解更多Ufeff、U3000 unicode、Python csv u3000有關寵物文章或書籍,歡迎來萌寵公園提供您完整相關訊息.
- 3Pythonで文字列の一部を削除(stripなど) - nkmk note
改行 \n や全角スペース \u3000 やタブ \t などが空白文字とみなされ削除される。 print() の出力だと分かりにくいが、元の文字列には c のあとに全角 ...
- 4Python 空白を削除するメソッド2つ知ってる? - BlogMuu
ついでに、改行を削除するメソッド、文字列を削除するメソッドも解説しました。 ... \tは「Tab」を押したときと同じ; \u3000は全角の空白文字.
- 5いろんな空白文字を削除する【Python】 - Qiita
改行コード、タブ、スペースなどをまとめて削除. str.split() を使う. Copied! #\u3000は全角スペース ...