Pythonは高水準で動的な型付けが可能なマルチパラダイムプログラミング言語です。特に、様々なタスクのための組み込みツールが多数用意されており、アイデアを素早くプロトタイプ化してテストするのに必要な労力を軽減してくれます。文字列はコンピュータサイエンスで最もよく使われるデータ構造の1つであり、当然ながら、文字列を操作することは一般的な手順となります。
このガイドでは、Pythonで文字列操作を行う方法を学びます。
文字列と文字列の操作
文字列とは、文字の並び(というか、文字列)です。ほとんどのプログラミング言語では、文字の配列として実装され、それらが一緒になって1つのオブジェクトとして機能します。つまり、文字列の操作は、配列の中の文字を変更することに集約されます。
注意:Pythonを含むほとんどの言語では、文字列は不変です。つまり、一度作成された文字列は変更できません。文字列を変更したい場合は、元の文字列と変更したい文字列から構成される新しい文字列が作成されます。これは、文字列は非常によく使われるものなので、共通のプールに「プール」して、そこからオブジェクトを同じ文字列に再利用できるようにするためです(これはかなり頻繁に起こります)。ほとんどの場合、これによってシステムのメモリ上でオブジェクトの初期化を行う際のオーバーヘッドが下がり、言語のパフォーマンスが向上します。これは文字列のインターニングとも呼ばれます。
Pythonでは – 文字列を宣言するには、一連の文字をシングルクォート、ダブルクォート、トリプルクォートで囲みます(str()
コンストラクタはあってもなくてもかまいません)。
# Single quote
welcome = 'Good morning, Mark!'
# Double quote
note = "You have 7 new notifications."
# Triple quote allow for multi-row strings
more_text= """
Would
you
like
to
read
them?
"""
また、str()
コンストラクタを使って明示的に文字列オブジェクトを初期化することもできます。
welcome1 = 'Good morning Mark!'
welcome2 = str('Good morning Mark!')
使っているPythonのバージョンやコンパイラによって、2行目は文字列をインターンするかしないか決まります。ビルトインの id()
関数はこれを確認するために使用することができます。
print(id(welcome1)) # 1941232459688
print(id(welcome2)) # 1941232459328
現実的には、文字列のインターンやアプリケーションでのパフォーマンスについて心配する必要はありません。
注:もう一つの実装上の注意点は、他の言語が character
型の配列を string
型に変換するのとは異なり、 Python は文字型をサポートしていないことです。Pythonでは、characterは長さ 1
の文字列です。
Pythonでは、characterは長さ1の文字列です。作成したオブジェクトの型を確認すると、
str` と表示されるでしょう。
print(type(welcome1)) # class <'str'>
文字列クラスは、文字列を操作したり変更したりするのに使える、かなり長いメソッドのリストを提供します(文字列は不変なので、すべて変更されたコピーを返します)。さらに、標準的な演算子は文字列固有の用途のためにオーバーライドされているので、 +
のような演算子を使って文字列同士を「足す」ことができます!
文字列操作のための演算子
演算子はすべての言語の基礎であり、一般的には算術演算子 (+
, -
, *
, /
), 関係演算子 (<
, >
, <=
, =
, ==
) および論理演算子 (&
または AND
, |
または OR
などに丸められることが多いでしょう。文字列を直感的に扱えるように、Pythonの演算子は文字列を直接使えるようにオーバーライドされています!
文字列の足し算
整数の加算のほかに、+
演算子は2つの文字列を結合したり連結したりすることができます。
string_1 = "Hello"
string_2 = " World!"
print(string_1 + string_2) # Hello World!
文字列の乗算
よく使われる演算子として、乗算演算子 – *
があります。これは、複数の文字列やシーケンスを、1つの文字列の一部としてインスタンス化するために使用できます。
string = 'Recursion...' * 5
print(string) # Recursion...Recursion...Recursion...Recursion...Recursion...
式は右から左に評価されるので、ある文字列を掛け算して、別の文字列に足すことができます。
string = "I think I'm stuck in a " + "loop... " * 5
print(string) # I think I'm stuck in a loop... loop... loop... loop... loop...
足し算を使った文字列の割り付け
インプレース」演算子として知られる +=
演算子は、省略記法の演算子です。これは、代入された参照変数を加算の最初のオペランドとして挿入することにより、2つのオペランドの加算を短縮するものです。
s = 'Hello'
# Equivalent to:
# s = s + 'World'
s += 'World'
print(s) # HelloWorld
文字列操作のための関数
len()
len()関数は Python の名前空間に組み込まれているので、グローバルな便利な関数として呼び出すことができます。これは、リストやタプルなどのシーケンスの長さを評価するために使用されます。文字列はリストなので、その長さも
len()` 関数で評価することができます!
print(len("It's been 84 years...")) # 21
これは、任意の反復可能なシーケンスを入力として受け取り、その長さを整数値で返します。
find()
find()メソッドは、文字列の中からあるパターンの出現箇所を探し、その開始位置(インデックス)を返し、そうでなければ
-1` を返します。
text = "Writing Python is quite fun."
print(text.find("quite")) # 18
print(text.find("at")) # -1
find()メソッドはさらに 2 つのオプションの引数、
begと
endを受け取ります。str
は検索する文字列を定義し、 beg
は開始インデックス (デフォルトでは 0
) で、 end
は文字列の終了インデックス (デフォルトでは文字列の長さ) である。これらを変更することで、パターンの検索空間を変更することができる。
text = "I haven't been this choked up since I got a hunk of moussaka caught in my throat! - Hades."
text2 = "I"
print(text.find(text2)) # 0
print(text.find(text2, 10)) # 36
print(text.find(text2, 40)) # -1
注意: rfind()
メソッドは最後に出現したものを探します。
count()
count()` メソッドは、与えられたテキストから指定された部分文字列を探し(大文字小文字を区別する)、そのパターンが文字列中に何回現れるかを示す整数を返します。
text = "The flower that blooms in adversity is the most rare and beautiful of all – Mulan."
text_count = text.count('i')
print("The count of 'i' is", text_count) # The count of 'i' is 4
デフォルトでは、カウントは0から始まり、文字列の終わりまで続きますが、開始と終了のインデックスを指定することができます。
text = "The flower that blooms in adversity is the most rare and beautiful of all – Mulan."
# str, beg, end
text_count = text.count('i', 0, 5)
print("The count of 'i' is", text_count) # The count of 'i' is 0
スライシング
スライシングは、シーケンスをスライスするために使用できる、強力で汎用性の高い記法です! 反復可能なシーケンスから要素にアクセスするときと同じように、ブラケット記法を使用すると、開始インデックスと終了インデックスの間で要素のスライスにアクセスすることも可能です。
text = "Hello, World!"
print(text[6:12]) # World
スライス記法は3つの入力、 iterable[start:stop:step]
を受け取ります。startは開始インデックス (これを含む)、
stopは終了インデックス (これを含む)、
stepは増分値 (負数も可能) である。ステップを
2` にして、2番目(含む)と7番目(含まない)のインデックス間で文字列をスライスしてみましょう。
text = 'The code runs fast'
print(text[2:7:2]) # ecd
startswith()とendswith()です。
Python の startswith()
メソッドは文字列が与えられた部分文字列で始まるかどうかを判断し、 endswith()
メソッドは文字列が部分文字列で終わるかどうかをチェックし、どちらもブール値を返します。
text = "hello world"
print(text.startswith("H")) # False
print(text.endswith("d")) # True
注意: startswith()
と endswith()
は両方とも大文字と小文字を区別します。
文字列の書式設定
スペースの追加と削除
strip()メソッドは、行頭と行末の空白を除去します。これは、行末の空白文字を除去するための簡単な方法です。単に右や左のスペースを削除するには、
rstrip()や
lstrip()` を使用します。
text = ' a short break '
text.strip() # 'a short break'
text.rstrip() #' a short break'
text.lstrip() #'a short break '
文字列からホワイトスペースを除去する方法については、Pythonのstrip()メソッドのガイドを参照してください。
文字列の大文字小文字を変更する – upper()、lower()、capitalize()、title()、swapcase()
文字列の大文字小文字を変更するのは、とても簡単です! upper()、
lower()、
capitalize()、
title()そして
swapcase()` メソッドは、すべて文字列の大文字小文字を変更するために使用することができます。
text = "When life gets you down you know what you've gotta do? Just keep swimming! – Finding Nemo"
print(text.upper()) # Uppercases all characters
print(text.lower()) # Lowercases all characters
print(text.title()) # Title-case
print(text.capitalize()) # Capitalizes the first character
print(text.swapcase()) # Swaps whatever case for each character
この結果
WHEN LIFE GETS YOU DOWN YOU KNOW WHAT YOU'VE GOTTA DO? JUST KEEP SWIMMING! – FINDING NEMO
when life gets you down you know what you've gotta do? just keep swimming! – finding nemo
When Life Gets You Down You Know What You'Ve Gotta Do? Just Keep Swimming! – Finding Nemo
When life gets you down you know what you've gotta do? just keep swimming! – finding nemo
wHEN LIFE GETS YOU DOWN YOU KNOW WHAT YOU'VE GOTTA DO? jUST KEEP SWIMMING! – fINDING nEMO
split()とpartition()による文字列の分割・分割
部分文字列を見つけて、その位置に基づいて文字列を分割するには、 partition()
と split()
メソッドが必要になります。どちらも、分割を適用した文字列のリストを返します。どちらも大文字と小文字は区別されます。
partition()` メソッドは、最初に現れる分割点の前の部分文字列、分割点そのもの、そして分割点の後の部分文字列を返します。
text = "To be or not to be, that is the question"
print(text.partition('to be')) # ('To be or not ', 'to be', ', that is the question')
一方、split()
は、デフォルトではすべての空白文字で文字列を分割し、文字列中の別々の単語のリストを返します。
text = "To be or not to be, that is the question"
print(text.split()) # ['To', 'be', 'or', 'not', 'to', 'be,', 'that', 'is', 'the', 'question']
もちろん、split()
のコールで提供される他の文字で分割することもできます。
text = "To be or not to be, that is the question"
print(text.split(',')) # ['To be or not to be', ' that is the question']
join() による文字列の結合
join()` メソッドは、文字列インスタンスのみを含むイテレートに対して動作し、すべての要素をひとつの文字列に結合します。このメソッドが呼び出されるのは、反復記号を結合する文字列ではなく、区切り記号を表す文字列であることに注意しましょう。
text = ['One', 'Two', 'Three', 'Four']
print(', '.join(text)) # One, Two, Three, Four
となります。
リストと文字列の結合について、異なるデータ型を含むより詳細なガイドは、Python.NETを参照してください。join()でリストを文字列に変換するを参照してください。
をご覧ください。
サブストリングの置換
どこにあるのかわからない部分文字列を置き換えるのは、とても簡単です! replace()` メソッドを使うと、置換するパターンを指定し、そのスペースに新しいパターンを挿入することができます。
text = "Because of what you have done, the heavens are now part of man's world"
print(text.replace("man's", "human's")) # Because of what you have done, the heavens are now part of the human world
結論
この記事では、文字列操作の一般的なテクニック、演算子、メソッド/関数について、関連する詳細なガイドを含めて説明しました。