『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

文字列の分割と連結

この記事では、Pythonの文字列を分割したり結合したりする方法について解説します。

文字列を分割・分割するメソッド

Python で文字列を結合・分割するメソッドの一覧です。

str.split():左端から区切り文字で分割

str.split() は文字列を、指定した区切り文字(デリミタ)で分割します。
区切り文字の検索開始位置は文字列の左端(先頭)です。

str.split(区切り文字 [,分割数])

分割数を指定しない場合は、すべての区切り文字で文字列が分割されます。

# PYTHON_STR_SPLIT

# In[1]

# ノーベル物理学賞受賞者
nobel = "レントゲン/ゼーマン/ローレンツ/ベクレル/キュリー"

# "/" で文字列を分割してリストを作成
nobel = nobel.split("/")

print(nobel)
# ['レントゲン', 'ゼーマン', 'ローレンツ', 'ベクレル', 'キュリー']

分割数を指定すると、左端から指定した分割回数だけ文字列を区切ります。

# In[2]

# ノーベル物理学賞受賞者
nobel = "ストラット/レーナルト/トムソン/マイケルソン/リップマン"

# 右から 2 個目の "/" まで区切ります
nobel = nobel.split("/", 2)

print(nobel)
# ['ストラット', 'レーナルト', 'トムソン/マイケルソン/リップマン']

引数に何も指定しない場合は、半角スペースをデリミタとして分割します。
連続した半角スペースは1つのデリミタとして扱われ、先頭と末尾の半角スペースは無視されます。

# In[3]

nobel_1 = "マルコーニ ファン・デル・ワース ヴィーン ダレーン オネス"
nobel_2 = "  ラウエ   ブラッグ バークラ    プランク   シュタルク    "

# 半角スペースをデリミタとして区切ります
nobel_1 = nobel_1.split()

# 連続した半角スペースは1つのデリミタとして認識されます
# 先頭と末尾の半角スペースは無視されます
nobel_2 = nobel_2.split()

print(nobel_1)
print(nobel_2)

# ['マルコーニ', 'ファン・デル・ワース', 'ヴィーン', 'ダレーン', 'オネス']
# ['ラウエ', 'ブラッグ', 'バークラ', 'プランク', 'シュタルク']

str.rsplit():右端から区切り文字で分割

 str.rsplit() で指定した区切り文字(デリミタ)で 文字列を分割できます。
区切り文字の検索開始位置は文字列の右端(末尾)です。

str.rsplit(区切り文字 [,分割数])

分割数を指定すると、右端から指定した分割回数だけ文字列を区切ります。

# PYTHON_STR_RSPLIT

# In[1]

# ノーベル物理学賞受賞者
nobel = "ギヨーム/アインシュタイン/ボーア/ミリカン/シーグバーン"

# 右から 3 個目の "/" まで区切ります
nobel = nobel.rsplit("/", 2)

print(nobel)
# ['ギヨーム/アインシュタイン/ボーア', 'ミリカン', 'シーグバーン']

str.splitlines():改行位置で区切る

splitlines() メソッドは改行位置で分割して、各行を要素とするリストを返します。

str.splitlines([keepends])

keepends は改行部分を keep するかどうか、すなわち返されるリストの要素の中に改行を含めるかを決めるオプション引数で、省略するか True 以外の値を入れると改行は含まれません。以下のサンプルコードではエスケープシーケンス \n で改行しています。

# PYTHON_STR_SPLITLINES

# In[1]

my_str = "湯川秀樹は原子核内部において陽子と中性子を互いに結合させる中間子の存在を予言しました。\n1947年に英国の物理学者パウエルが宇宙線の中からパイ中間子を発見し、理論の正しさが証明されます。\nこれによって湯川秀樹に日本人初となるノーベル物理学賞が授与されました。"

# 文字列を改行位置で区切ってリストを作成します
my_str = my_str.splitlines()

print(my_str)
# ['湯川秀樹は原子核内部において陽子と中性子を互いに結合させる中間子の存在を予言しました。', '1947年に英国の物理学者パウエルが宇宙線の中からパイ中間子を発見し、理論の正しさが証明されます。', 'これによって湯川秀樹に日本人初となるノーベル物理学賞が授与されました。']

引数に True を指定すると要素の末尾に \n が付きます。

# In[2]

my_str = "ノーベル物理学賞を英訳すると Nobel Prize in Physics です。\n開催地スウェーデンでは Nobelpriset i fysik と綴ります。\nこのように両言語の発音や表記には類似性があります。\n英語とスウェーデン語はともにゲルマン語派に属する言語です。"

# 文字列を改行位置で区切ってリストを作成します
my_str = my_str.splitlines(True)

print(my_str)
# ['ノーベル物理学賞を英訳すると Nobel Prize in Physics です。\n', '開催地スウェーデンでは Nobelpriset i fysik と綴ります。\n', 'このように両言語の発音や表記には類似性があります。\n', '英語とスウェーデン語はともにゲルマン語派に属する言語です。']

str.partition():区切り文字の最初の出現位置で区切る

partition()メソッドは先頭に最も近い位置にある区切り文字で文字列を区切り、3 つの要素をもつタプルで返します。

str.partition(区切り文字)

タプルの要素は区切り前の文字列、区切り文字そのもの、そして区切りの後ろの文字列となります。

# PYTHON_PARTITION

# ノーベル物理学賞受賞者
nobel = "フランク/ヘルツ/ペラン/コンプトン/ウィルソン"

# 一番左端にある "/" で区切ってタプルを生成します 
nobel = nobel.partition("/")

print(nobel)
# ('フランク', '/', 'ヘルツ/ペラン/コンプトン/ウィルソン')

str.rpartition():区切り文字の最後の出現位置で区切る

rpartition()メソッドは末尾に最も近いところにある区切り文字で文字列を区切って、3 つの要素をもつタプルを返します。

str.rpartition(区切り文字)

タプルの要素は区切り前の文字列、区切り文字そのもの、そして区切りの後ろの文字列となります。

# PYTHON_STR_RPARTITION

# In[1]

# ノーベル物理学賞受賞者
nobel = "リチャードソン/ブロイ/ラマン/ハイゼンベルク/シュレーディンガー"

# 一番右端にある "/" で区切ってタプルを生成します 
nobel = nobel.rpartition("/")

print(nobel)
# ('リチャードソン/ブロイ/ラマン/ハイゼンベルク', '/', 'シュレーディンガー')

str.join():リストの要素を連結

join()メソッドを用いると、リストやタプル、あるいは set などの要素を区切り文字で連結させることができます。

str.join(イテラブルオブジェクト)

join() は文字列に備わるメソッドであり、引数のほうにイテラブルを渡します(リストなどを操作するので、イテラブルのもつメソッドだと勘違いされやすいです)。str には区切り文字として使いたい文字を渡します。たとえば、リストの各要素を “,” でつなぎたい場合には

",".join(リスト)

のように記述します。簡単なサンプルコードを見てみましょう。

# PYTHON_STR_JOIN

# In[1]

# ノーベル物理学賞受賞者のリスト
nobel = ["ディラック", "チャドウィック", "ヘス", "アンダーソン", "デイヴィソン"]

# リストの各要素を "," で結合します
nobel = ",".join(nobel)

print(nobel)
# ディラック,チャドウィック,ヘス,アンダーソン,デイヴィソン

引数に渡すリストをタプルにしても全く同じ結果になりますが、set を渡すと要素の順番が崩れます。

# In[2]

# ノーベル物理学賞受賞者のセット
nobel = {"ディラック", "チャドウィック", "ヘス", "アンダーソン", "デイヴィソン"}

nobel = ",".join(nobel)

print(nobel)
# ディラック,デイヴィソン,チャドウィック,アンダーソン,ヘス

引数として渡すイテラブルの中に数値が含まれているとエラーが返されます。

# In[3]

# ノーベル物理学賞(受賞年と受賞者)
nobel = [1937, "トムソン", 1938, "フェルミ", 1939, "ローレンス"]

nobel = ",".join(nobel)

print(nobel)
'''
TypeError  Traceback (most recent call last)
 in ()
      2 nobel =[1937, "トムソン", 1938, "フェルミ", 1939, "ローレンス"]
      3 
----> 4 nobel = ",".join(nobel)
      5 
      6 print(nobel)

TypeError: sequence item 0: expected str instance, int found
'''

「str 型を予測していたのに、int 型が見つかった」と警告されています。このように、join() はそのままでは文字列の要素のみをもつイテラブルにしか使えません。しかし、数値型を文字列型に変換することで、数値を含めたイテラブルの要素を連結することができます。たとえば次のように map 関数を使う方法があります。

# In[4]

# ノーベル物理学賞(受賞年と受賞者)
nobel = [1937, "トムソン", 1938, "フェルミ", 1939, "ローレンス"]

# リストのすべての要素を文字列に変換
nobel = map(str, nobel)

# 新しいリストの要素を連結
nobel = ",".join(nobel)

print(nobel)
# 1937,トムソン,1938,フェルミ,1939,ローレンス

map はイテラブルなオブジェクトの要素全てに指定した処理を実行させる便利な関数です。上の例では nobel というリストの要素1つ1つを str 関数で文字列に変えるという処理を行なっています。

コメント