Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonの文字列(str)徹底解説:最も人気のあるデータ型の基本と操作方法

文字列は、Pythonにおいて最もよく使われるデータ型のひとつです。文字列とは、簡単に言えば「文字の並び」で構成されるオブジェクトのことです。ここでいう文字とは記号のことであり、たとえば英語のアルファベットは26個の文字から成り立っています。

Pythonの文字列は作成も操作もとても簡単で、今すぐ学び始めることができます。この記事では、Pythonにおける文字列の仕組みと、よく使われる操作方法について詳しく解説します。

Pythonにおける文字列とは?

Pythonで文字列を作成するのは非常にシンプルです。文字をシングルクォート(')またはダブルクォート(")で囲むだけです。文字列を変数に代入することで、宣言と初期化が完了します。

doubleQuoteString = "I'm a string"
singleQuoteString = 'I\'m a string' # シングルクォート内ではアポストロフィをエスケープする必要があります

注意点として、シングルクォートで囲んだ文字列の中にアポストロフィを使いたい場合は、「\」(バックスラッシュ)でエスケープする必要があります。こうすることで、そのクォートが文字列の終わりではなく、文字列の一部として扱われます。

Docstringと複数行文字列

Pythonには、トリプルクォート(""")で囲まれた「docstring」と呼ばれる特殊な文字列もあります。これは関数やクラスの先頭行に記述され、複数行コメントとして扱われます。

def printString(str):
 ''' 文字列を受け取ってコンソールに出力します '''
 print(str)

docstringは、そのコードブロックの目的を説明するためのものです。もしロジックの中でdocstringを使いたい場合は、変数に代入することで利用できます。変数に代入されたdocstringは、複数行文字列として機能します。

multiline = '''     I'm a multi-line string that can be assigned to a variable. The format
follows exactly
   the
         way
             YOU
                 input it. 
                
                
                 '''
print(multiline)

複数行文字列は、トリプルクォート内に入力した通りのフォーマットをそのまま保持します。変数に代入しなければ、単なるコメントとして扱われ、プログラム実行時にはスキップされます。

Raw文字列(生文字列)

Pythonには「raw文字列」という概念があります。これは、文字列内のすべてを書いた通りに扱うもので、特にバックスラッシュがエスケープシーケンスとして解釈されなくなります。以下の比較を見てみましょう。

notRaw = "I'm a not a raw string, and escape chars DO matter \n\r\t\b\a"
rawString = r"I'm a raw string, where escape chars don't matter \n\r\t\b\a"
print(notRaw) # エスケープ文字が有効な通常の文字列
 
print(rawString) # エスケープ文字がそのまま表示されるraw文字列

raw文字列は、通常の文字列の前に「r」を付けるだけで表現できます。

r"This is a raw string"

バックスラッシュを特別なエスケープシーケンスとして解釈してほしくない場合に、raw文字列を使用しましょう。

文字列内でのUnicode文字の扱い

Unicodeとは、世界中のあらゆる言語で使われるすべての文字に固有のコードを割り当てることを目指した文字規格です。多くのドキュメントでは、Unicodeの値は次のように表記されます。

U+<unicode hex value> ⇒ U+2661 ⇒ ♡

U+2661は、利用可能なUnicode文字の一例です。世界のあらゆる言語を網羅する何万種類もの文字から選ぶことができます。

Python 3でのUnicodeの書き方

Python 3でUnicode文字を記述するには、通常の文字列内で「\u」で始まり、その後に文字に割り当てられたコード(「+」の後ろの番号)を続けたエスケープシーケンスを使います。

unicodeString = '\u2661'
print(unicodeString) # ♡ 

Unicode文字は、いくつでも連続して並べることができます。

なお、この通常の文字列内でUnicodeを使う方法は、Python 2から更新されたものです。古いバージョンでは、ASCII値とUnicode値が混在していたため、u'\u<unicode number here>'のように「u」を付けた専用のUnicode文字列を使う必要がありました。

文字列の値へのアクセス方法

Pythonで文字列内の値にアクセスするには、角括弧([])を使用します。他の多くのプログラミング言語と同様に、文字列はゼロベースのインデックスを持っています。つまり、最初の文字はインデックス0から始まります。

hello = "hello world"
 
print(hello[4]) # o

helloの4番目のインデックスを出力すると、コンソールには「o」が表示されます。存在しないインデックスにアクセスしようとすると、IndexError: string index out of rangeというエラーが発生します。このエラーは、実際のインデックス数より大きい、または範囲外のインデックスにアクセスしようとしたことを意味します。

補足: CやJavaのようなプログラミング言語の経験がある方は、文字が独立したデータ型を持つことに慣れているかもしれません。しかしPythonではそうではなく、個々の文字は単純に「長さ1の部分文字列」として扱われます。

文字列内の複数文字へのアクセス(スライス)

文字列内の複数の文字に一度にアクセスするには、スライスを使用します。構文は次のとおりです。

string_name[first_index? : another_index?]

終了インデックスは範囲に含まれません。先ほどの例でHello[1:3]を実行すると、ellではなくelが返されます。

Pythonのスライスの面白い点は、インデックス値を省略できることです。ここでは、Pythonで文字列をスライスする一般的な方法を紹介します。

  • string_name[:]

    角括弧の中にコロンだけを書くと、文字列全体がスライスされ、コピーが作成されます。
hello = "hello world"
copy = hello[:] + " ⇐ whole string"
print(copy) # hello world ⇐ whole string
  • string_name[first_index:]

    開始インデックスだけを指定し、終了インデックスを空にすると、その位置から文字列の末尾までをスライスできます。
hello = "hello world"
copy = hello[2:] + " ⇐ An index to end of string"
print(copy) # llo world ⇐ An index to end of string
  • string_name[:second_index]

    開始インデックスを空にして終了インデックスだけを指定すると、文字列の先頭からその位置までをスライスできます。
hello = "hello world"
copy = hello[:7] + " ⇐ beginning to index inside of string"
print(copy) # hello w ⇐ beginning to index inside of string
  • string_name[first_index:second_index]

    2つの具体的なインデックスを指定する場合は、終了インデックスが含まれないことを忘れないでください。たとえば、インデックス1から6までの文字列を取得したい場合は、hello[1:7]と記述します。
hello = "hello world"
copy = hello[1:7] + " ⇐ first index to another index"
print(copy) # ello w ⇐ beginning to another index inside of string

負の数を使った指定も可能です。

hello = "hello world"
copy = hello[-7:-2] + " ⇐ negative indexes"
print(copy) # o wor ⇐ negative indexes

文字列スライスは、元の文字列を変更せずに操作したい場合に非常に便利です。選択したインデックス範囲のコピーがメモリ上に新しく作成されるため、元の文字列に影響を与えることなく編集できます。

Pythonで文字列をループ処理する方法

Pythonでは、文字列を配列とほぼ同じように扱えます。for…in構文を使えば、配列と同じように文字列をループ処理できます。

#for...in syntax
for <index> in <string>:
   #do logic here
 
#example
word = "career karma"
 
for letter in word:
   print(letter)    #各反復ごとに1文字ずつ出力されます

<index>に「letter」、<string>に「word」を割り当てることで、「career karma」をループ処理します。反復のたびに、その時点の文字がコンソールに出力されます。

文字列の長さを取得する方法

文字列の長さを取得するには、len()メソッドを使用します。

lenExample = "The quick brown fox jumps over the lazy dog."
print(len(lenExample))

注意:コード内の他の場所で「len」という名前の変数を作成しないでください。インタプリタが組み込み関数と混同してしまう可能性があります。

「in」と「not in」の使い方

Pythonでは、キーワード「in」と「not in」を使って、特定の要素が文字列に含まれているかどうかを確認できます。

checkString = "Career Karma will help you make a career switch to the tech industry"

以降の2つの例では、このcheckStringを使用します。

「in」の使い方

inキーワードを使うと、検索対象の語句が変数に代入された文字列内に存在するかどうかをPythonインタプリタに問い合わせられます。

print("tech" in checkString) # True

Pythonは読みやすさに優れた言語です。この構文は、まさに人に質問するときの言い回しと同じ感覚で書けます。

Q:「tech」はcheckStringの中にある?("tech" in checkString)

    (文字列を走査)

A:「はい、あります。」(True)

「not in」の使い方

not inは、ある要素が文字列に「含まれていない」ことを確認するためのキーワードです。少し頭をひねる必要があるので注意しましょう。「〜は文字列に含まれていないか?」と尋ねたとき、含まれていなければ「True」、含まれていれば「False」が返されます。

print("tech" not in checkString) # False

この構文を会話に置き換えると、次のように読めます。

Q:「tech」はcheckStringの中にない?("tech" not in checkString)

    (文字列を走査)

A:「いいえ、『tech』という言葉はcheckStringの中にあります。」(False)

文字列の中身は変更できる?

Pythonの文字列はイミュータブル(不変)です。つまり、一度代入された文字列を構成する文字は、後から変更することができません。

delString = "Can we delete this or change this?"
delString[2] = "b"
print(delString)

このコードをPythonインタプリタで実行してみてください。次のようなエラーが発生します。

Traceback (most recent call last):
 File "main.py", line no., in <module>
   delString[2] = "b"
TypeError: 'str' object does not support item assignment

このTypeErrorは、Pythonの文字列では個々の文字の再代入が許されていないことを示しています。個別の文字を変更したい場合は、新しい文字列全体を再代入する必要があります。

delString = delString[:2] + "b" + delString[3:]
 
print(delString)

このコードは、先ほどのdelString[2] = "b"で意図していた処理を正しく実現する方法です。文字列オブジェクトを変更するには、文字列全体の再代入が必要になります。

同様に、文字列から1文字だけを削除することもできません。ただし、delキーワードを使えば、文字列オブジェクト自体を丸ごと削除することは可能です。

del delString
 
print(delString) # エラーが返されるか、リンターが未定義として検出します

よく使われる文字列メソッド

Pythonの文字列には、便利なメソッドが多数用意されています。最新の一覧については、Python公式ドキュメントを確認してください。

ここでは、特によく使われるメソッドを紹介します。以下のtestStringは、各メソッドの動作を示すためのサンプル文字列です。

testString = "this is a test string."

capitalize()

capitalizeメソッドは、文字列の最初の文字を大文字にします。

capitalized = testString.capitalize()
print(capitalized) # This is a test string

find()

この組み込みメソッドは、引数として渡した文字列が最初に現れるインデックスを返します。見つからない場合は-1を返します。

found = testString.find("test")
notfound = testString.find("not")
 
print(found) # 10
print(notfound) # -1

join()

joinメソッドは、引数として渡されたイテラブルオブジェクト(文字列、セット、タプル、リストなど)をループ処理し、メソッドを呼び出した区切り文字列を各要素の間に挿入します。以下はその例です。

separator = ", " # 区切り文字 - メソッドはこの文字列に対して呼び出されます
numbers = "123" # イテラブル。この場合は文字列
 
joinedByComma = separator.join(numbers)
print(joinedByComma) # 1, 2, 3

joinメソッドをいろいろ試して、リスト・セット・タプルなどの他のイテラブルで何ができるのか、ぜひ確かめてみてください。

lower() と upper()

lowerとupperは、文字列の大文字・小文字を扱う組み込み関数です。lowerはすべて小文字に変換した文字列のコピーを、upperはすべて大文字に変換した文字列のコピーを作成します。

uppercase = testString.upper()
print(uppercase) # THIS IS A TEST STRING
 
lowercase = testString.lower() 
print(lowercase) # this is a test string

これらは文字列操作に使えるメソッドのごく一部です。これらを習得したら、split()replace()title()swapcase()といった他のPython文字列メソッドもチェックしてみましょう。

まとめ

この記事では、Pythonの文字列とは何か、その使い方、そして利用可能な組み込みメソッドについて解説しました。このガイドをマスターしたら、さらに学習を深めるために、Pythonの文字列フォーマットに関する記事もぜひ参照してください。

  1. Pythonのデータ型と型変換をわかりやすく解説

    この記事では、Pythonにおける主要なデータ型の種類と、それぞれの使い方、そしてデータ型同士を変換する方法について詳しく解説します。 Pythonの組み込みデータ型一覧 Pythonでは変数を作成・宣言する際に、さまざまなデータ型を持たせることができます。Pythonには以下のような組み込みデータ型が用意されています。 str(文字列) int、float、complex(数値) list、tuple(シーケンス) dict(辞書) set(集合) bool(ブール値) bytes、bytearray(バイナリ) それでは、各データ型の特徴と作成方法を順番に見ていきましょう。 文字列型:

  2. Pythonの文字列操作入門|作成・インデックス・スライス・フォーマットの基本をわかりやすく解説

    文字列はPythonにおける最も基本的なデータ型のひとつです。英字・数字・記号など、任意の文字を組み合わせたものが文字列として扱われます。このチュートリアルでは、文字列の作成方法から、インデックスやスライスによる操作、フォーマットの使い方まで、さまざまな場面で役立つ基本操作を体系的に解説します。 Pythonで新しい文字列を作成する Pythonで文字列を作成するのはとても簡単です。シングルクォート()またはダブルクォート()で文字の並びを囲むだけで宣言できます。また、複数行にわたる長い文字列を作りたい場合は、トリプルクォート( または )を使用します。 double_quotes = My