Python 文字列操作

PythonBeginner

はじめに

この実験(Lab)では、Python における文字列を操作するための基本的なテクニックを探求します。文字列は最も一般的なデータ型の一つであり、それらを効果的に扱う方法を知ることは、あらゆる Python プログラマにとって不可欠なスキルです。基本的な定義、特殊文字の使用、複数行文字列の作成から、部分文字列へのアクセス、内容の確認、大文字・小文字の変更、検索、分割、テキストのフォーマットといった、より高度な操作までを網羅します。この実験を終える頃には、Python プログラムでテキストデータを扱うための強固な基盤を築いているでしょう。

エスケープ文字と複数行文字列

このステップでは、文字列内の特殊文字の扱い方、これらの特殊文字を無視する文字列の作成方法、および複数行にわたる文字列の定義方法について学習します。

まず、エスケープ文字について見ていきましょう。エスケープ文字とは、バックスラッシュ \ の後に挿入したい文字が続くものです。例えば、\n は改行を表し、\' はシングルクォートを表します。

注記: WebIDE (VS Code のようなもの) の使用に慣れていない場合は、まずこちらの実験 (lab)で学習してください。

左側のファイルエクスプローラーから main.py ファイルを開きます。以下のコードをファイルに追加してください。

## エスケープ文字:バックスラッシュを使用して特殊文字を挿入します
## \n = 改行,\' = シングルクォート
print("Hello there!\nHow are you?\nI\'m doing fine.")

次に、ターミナルを開き、以下のコマンドを実行してスクリプトを実行します。ターミナルパネルの + アイコンをクリックすると、新しいターミナルを開くことができます。

python3 main.py

改行とシングルクォートが正しく挿入された出力が表示されます。

Hello there!
How are you?
I'm doing fine.

続いて、raw 文字列を見てみましょう。r をプレフィックスとして付けた raw 文字列は、すべてエスケープ文字を無視し、文字列内に現れるバックスラッシュをそのまま出力します。これは、正規表現やファイルパスを使用する場合に特に便利です。

main.py の内容を以下のコードに置き換えてください。

## raw 文字列 (r プレフィックス): バックスラッシュをリテラル文字として扱います
print(r"Hello there!\nHow are you?\nI\'m doing fine.")

スクリプトを再度実行します。

python3 main.py

出力において、\n と \' がリテラル文字として扱われていることに注目してください。

Hello there!\nHow are you?\nI\'m doing fine.

最後に、トリプルクォート (""" または ''') を使用して複数行文字列を作成できます。これは、フォーマットを保持したまま複数行にわたる文字列を定義する便利な方法です。

main.py の内容をこの例に置き換えてください。

print(
"""Dear Alice,

Eve's cat has been arrested for catnapping,
cat burglary, and extortion.

Sincerely,
Bob"""
)

スクリプトを実行します。

python3 main.py

出力は、フォーマットされた複数行のメッセージになります。

Dear Alice,

Eve's cat has been arrested for catnapping,
cat burglary, and extortion.

Sincerely,
Bob

文字列のインデックス指定とスライス

このステップでは、インデックス指定とスライスを使用して、個々の文字へのアクセス方法と部分文字列の抽出方法を学びます。

Python の文字列はシーケンス(配列のようなもの)であるため、インデックスを使用してその一部にアクセスできます。インデックス指定は、最初の文字が 0 から始まります。

H   e   l   l   o       w   o   r   l   d    !
0   1   2   3   4   5   6   7   8   9   10   11

main.py ファイルをクリアし、以下のコードを追加して文字列を定義します。

spam = 'Hello world!'

最初の文字 ('H') にアクセスするにはインデックス 0 を使用します。5 番目の文字 ('o') にアクセスするにはインデックス 4 を使用します。負のインデックスを使用して文字列の末尾から数えることもでき、-1 は最後の文字を指します。

インデックス指定がどのように機能するかを確認するために、これらの print 文を main.py に追加します。

spam = 'Hello world!'

## String indexing: access characters by position (0-based)
print(spam[0])    ## 最初の文字を返す
print(spam[4])    ## 5 番目の文字を返す
print(spam[-1])   ## 最後の文字を返す

スクリプトを実行します。

python3 main.py

アクセスした個々の文字が出力に表示されます。

H
o
!

スライスを使用すると、文字列の一部(部分文字列と呼ばれます)を抽出できます。構文は [start:end] であり、start インデックスから始まり、end インデックスの直前までの文字を抽出します。

スライスの練習をしましょう。main.py の内容を以下のコードに置き換えてください。文字列をスライスするいくつかの異なる方法を探ります。

spam = 'Hello world!'

## String slicing: extract substring using [start:end] syntax
print(spam[0:5])    ## インデックス 0 から 4 までの文字を返す
print(spam[:5])     ## start インデックスを省略すると 0 がデフォルトになる
print(spam[6:])     ## end インデックスを省略すると文字列の最後までがデフォルトになる
print(spam[::-1])   ## ステップに -1 を指定すると文字列が反転する

スクリプトを実行します。

python3 main.py

スライスによって作成された異なる部分文字列を観察してください。

Hello
Hello
world!
!dlrow olleH

文字列のメンバーシップとケースメソッド

このステップでは、部分文字列が文字列内に存在するかどうかを確認する方法、および文字列のケースを変更したり検証したりする方法を学習します。

in および not in 演算子は、文字列のメンバーシップを確認するために使用されます。これらはブール値 (True または False) を返します。

main.py ファイルをクリアし、これらの演算子をテストするために以下のコードを追加します。比較は大文字と小文字を区別することに注意してください。

## The 'in' and 'not in' operators
print('Hello' in 'Hello World')
print('HELLO' in 'Hello World')
print('cats' not in 'cats and dogs')

スクリプトを実行して、ブール値の結果を確認します。

python3 main.py
True
False
False

Python には、文字列のケースを変更するためのいくつかのメソッドも用意されています。upper()、lower()、および title() メソッドは、それぞれすべて大文字、すべて小文字、またはタイトルケース(各単語の先頭が大文字)の新しい文字列を返します。

main.py の内容を以下に置き換えます。

greet = 'Hello world!'
print(greet.upper())
print(greet.lower())
print(greet.title())

スクリプトを実行します。

python3 main.py

変換された文字列が表示されます。

HELLO WORLD!
hello world!
Hello World!

文字列が特定のケースになっているかどうかを確認するには、isupper() および islower() メソッドを使用できます。これらのメソッドは、文字列内のすべての大文字/小文字が指定されたケースであり、少なくとも 1 つの文字(cased character)が含まれている場合に True を返します。

main.py の内容をこれらの例に置き換えます。

spam = 'Hello world!'
print(spam.islower())

print('HELLO'.isupper())

## This is true because non-letter characters are ignored
print('abc12345'.islower())

## This is false because there are no cased characters
print('12345'.islower())

スクリプトを実行して、各文字列のケースを検証します。

python3 main.py
False
True
True
False

文字列の検索と分割

このステップでは、文字列が特定のサブ文字列で始まるか終わるかを確認する方法、文字列のリストを単一の文字列に結合する方法、および文字列をサブ文字列のリストに分割する方法を学習します。

startswith() および endswith() メソッドは、文字列の先頭または末尾を確認するのに役立ちます。これらは True または False を返します。

main.py をクリアし、以下のコードを追加します。

print('Hello world!'.startswith('Hello'))
print('Hello world!'.endswith('world!'))
print('abc123'.startswith('abcdef'))

スクリプトを実行して結果を確認します。

python3 main.py
True
True
False

join() メソッドは、セパレータ文字列に対して呼び出され、引数としてイテラブル(リストなど)を受け取ります。これは、イテラブルの要素を単一の文字列に結合し、各要素の間にセパレータを配置します。

join() の動作を確認するために、main.py の内容をこれらの例に置き換えます。

## Join with a comma and space separator
print(', '.join(['cats', 'rats', 'bats']))

## Join with a space separator
print(' '.join(['My', 'name', 'is', 'Simon']))

スクリプトを実行します。

python3 main.py
cats, rats, bats
My name is Simon

split() メソッドは join() の逆の操作を行います。これは文字列に対して呼び出され、文字列をサブ文字列のリストに分割します。デフォルトでは空白文字で分割されますが、特定の区切り文字を指定することもできます。

文字列の分割を練習するために、main.py の内容を以下のコードに置き換えます。

## Split by default whitespace
print('My name is Simon'.split())

## Split by a specific delimiter 'ABC'
print('MyABCnameABCisABCSimon'.split('ABC'))

スクリプトを実行して、結果のリストを確認します。

python3 main.py
['My', 'name', 'is', 'Simon']
['My', 'name', 'is', 'Simon']

文字列の配置と整形

このステップでは、テキストの配置をフォーマットする方法、および文字列の先頭または末尾から空白文字などの不要な文字を削除する方法を学習します。

Python には、指定された幅内でテキストを整形するためのメソッドが用意されています:rjust() (右寄せ)、ljust() (左寄せ)、および center() です。これらのメソッドは、パディングされた新しい文字列を返します。

main.py ファイルをクリアし、以下のコードを追加します。

print('Hello'.rjust(10))
print('Hello'.ljust(10))
print('Hello'.center(20))

スクリプトを実行して、整列されたテキストを確認します。出力中の一重引用符はパディングを視覚化するのに役立ちます。

python3 main.py
     Hello
Hello
       Hello

オプションの 2 番目の引数を提供することで、スペース以外の埋め文字(fill character)を指定することもできます。main.py の内容を以下に置き換えます。

print('Hello'.rjust(20, '*'))
print('Hello'.center(20, '='))

再度スクリプトを実行します。

python3 main.py
***************Hello
=======Hello========

文字列をクリーンアップするために、strip()、rstrip()、および lstrip() メソッドを使用できます。これらは文字列の末尾から文字を削除するために使用されます。デフォルトでは、空白文字(スペース、タブ、改行)を削除します。

main.py の内容をこの例に置き換えます。

spam = '    Hello World     '
print(spam.strip())   ## 両端から削除
print(spam.lstrip())  ## 左側から削除
print(spam.rstrip())  ## 右側から削除

スクリプトを実行して、クリーンアップされた文字列を確認します。

python3 main.py
Hello World
Hello World
    Hello World

これらのメソッドに文字列引数を渡すことで、削除する文字を指定することもできます。メソッドは、引数に含まれる文字のうち、文字列の末尾にあるすべての文字を削除します。

最後に main.py の内容を置き換えます。

spam = 'SpamSpamBaconSpamEggsSpamSpam'
## Removes all characters 'S', 'p', 'a', 'm' from the ends
print(spam.strip('ampS'))

スクリプトを実行します。

python3 main.py

出力は、外側の「Spam」部分が削除され、文字列の中央部分が残っていることを示しています。

BaconSpamEggs

まとめ

この実験(Lab)では、Python における文字列操作の必須テクニックを習得しました。より良いテキスト表現のために、エスケープ文字の使用方法と複数行文字列の作成方法を学びました。インデックス指定とスライスを使用して文字列の一部にアクセスする練習をしました。さらに、メンバーシップの確認 (in, not in)、大文字・小文字の変更 (upper(), lower())、大文字・小文字の検証 (isupper(), islower())、検索 (startswith(), endswith())、結合と分割、そして最後にテキストの整形とクリーニング (rjust(), strip()) といった強力な文字列メソッドを探求しました。これらのスキルは、Python でのテキスト処理を伴うあらゆるタスクの基礎となります。