【Python】文字列の処理・比較・使い方

Python入門者向けに文字列の処理・使い方についてまとめました。

【はじめに】文字列型の変数

Pythonでは、文字列型の変数を次のように定義します。

a = 'TEST'

文字列「TEST」をシングルクォーテーション(‘)、もしくはダブルクォーテーション(“)で括ってやり、変数aへ代入するだけです。

関連記事
1 【Python】文字列型の変数を定義

【文字列の連結】+(プラス)記号

Pythonでは、文字列の連結は四則演算の足し算と同じように+(プラス)を使います。

文字列 + 文字列

a = "abc" + "def"

print(a) # abcdef

文字列型の変数 + 文字列型の変数

a = "abc"
b = "def"

c = a + b

print(c) # abcdef
関連記事
1 【Python】文字列の連結

【文字列の置換】replace

「replace」関数で文字列を置換できます。
この関数は、1つ目の引数に置換前の文字列、2つ目の引数に置換後の文字列を指定します。

data = "hello wall"

data = data.replace("wall", "world")

print( data ) # hello world

この実行例では、文字列「wall」を「world」に置換しています。

詳細記事
1 【Python】文字列の置換(replace関数)

【文字列の検索】「find」「index」「startswith」「endswidth」

Pythonでは、文字列検索系メソッドとして「find」「index」「startswith」「endswidth」などがあります。
それぞれの探索の特徴は以下のとおりです。

説明
find 部分文字列の検索。指定した文字列があればindex(場所)を、ない場合は-1を返す。
index 部分文字列の検索。指定した文字列があればindex(場所)を、ない場合はエラーを返す。
startswith 指定した文字列で始まるかどうか調べる。始まればTrue、そうでなければFalseを返す。
endswith 指定した文字列で終わるかどうか調べる。始まればTrue、そうでなければFalseを返す。

find

部分文字列の検索。
指定した文字列があればindex(場所)を、ない場合は-1を返す。

data = "hello world"

print( data.find("ell") ) # 1
print( data.find("untan") ) # -1

index

部分文字列の検索。
指定した文字列があればindex(場所)を、ない場合はエラーを返す。

data = "hello world"

print( data.index("ell") )# 1
print( data.index("untan") )# ValueError: substring not found

startswith

指定した文字列で始まるかどうか調べる。
始まればTrue、そうでなければFalseを返す。

data = "hello world"

print( data.startswith("hello") )# True
print( data.startswith("world") )# False

endswith

指定した文字列で終わるかどうか調べる。
始まればTrue、そうでなければFalseを返す。

data = "hello world"

print( data.endswith("hello") )# False
print( data.endswith("world") )# True
詳細記事
1 【Python】文字列の検索(find、index、startswith、endswidth関数)

【変換】数値 → 文字列

Pythonでは、数値を文字列へ変換するのに「str」関数を使います。

# -*- coding: utf-8 -*-

num = 100

ans = str(num)

print(ans) # 100

文字列の連結に応用

Pythonでは、文字列と数値を連結できないため、このstr関数を使って数値を文字列に変換することで 連結ができます。

# -*- coding: utf-8 -*-

a = 100
b = "abc"

c = str(a) + b

print(c) # 100abc
関連記事
1 【Python】数値を文字列に変換(str関数)

【変換】文字列 → 数値

Pythonでは、int関数、float関数で文字列を数値に変換します。

int関数 文字列を整数型の数値に変換
float関数 文字列を浮動小数点型の数値に変換

以下のプログラムだと文字列と数値は連結できないのでエラーとなります。

a = "100"
b = 100

c = a + b

print( c ) # TypeError: must be str, not int

しかしint関数やfloat関数で次のように文字列を数値に変換すると、数値同士の足し算となるのでエラーになりません。

a = "100"
b = 100

c = int(a) + b

print( c )
a = "1.23"
b = 100

c = float(a) + b

print( c )
関連記事
1 【Python】文字列を数値に変換(int, float関数)

【変換】大文字・小文字

Pythonでは、文字列を大文字から小文字へ変換するメソッドとして「lower」があります。
逆に小文字から大文字へ変換するメソッドとして「upper」があります。

data = "Hello World"

print( data.upper() ) # HELLO WORLD
print( data.lower() ) # hello world
関連記事
1 【Python】文字列の大文字・小文字変換(lower、upper関数)

【ハッシュ化】hashlibモジュール

Python言語の標準ライブラリ・モジュール「hashlib」で文字列からハッシュ値を生成できます。
このライブラリでは、MD5、SHA1、SHA224、SHA256、SHA384、SHA512のアルゴリズムで生成ができます。

書式 hashlib.アルゴリズム名(文字列).hexdigest()
返り値 生成されたアッシュ値
# -*- coding: utf-8 -*-
import hashlib

# 文字列
message = "nyanpasu"

# ハッシュ値を求めた結果
print("MD5:", hashlib.md5(message.encode("utf-8")).hexdigest() ) # MD5:14134e4e2a0d3dd5035763936ca75621
print("sha256:", hashlib.sha256(message.encode("utf-8")).hexdigest() ) # sha256:16923985d41d4e7d99ba7657a3c1a4bfcbd1b52f49d383b150e689740651ce1c
print("sha516:", hashlib.sha512(message.encode("utf-8")).hexdigest() ) # sha516:2ea4cbd945c9ba04ed75e3fdbb0a5bcea710710c09375b1d1fca2238df7a073bfcd90408da49801bf0cb8c8d3a0ba3e1cf4142ae0e1b0d2c1ba7e74002e2c444
関連記事
1 【Python】文字列のハッシュ化

【文字列の分割】カンマ区切り、空白区切り

Pythonでは、「split」関数で文字列を分割できます。
この関数は、引数に文字列を分割する区切り文字を指定します。
すると、リスト形式で分割した結果が返ってきます。

data = "hello,world"
data2 = data.split(",")

print(data2) # ['hello', 'world']

この実行例では、カンマ「,」を区切り文字に指定して分割しています。
split関数の引数に何も指定しない場合、空白(スペース、タブなど)で区切ることができます。

data = "hello world"
data2 = data.split()

print(data2) # ['hello', 'world']
関連記事
1 【Python】split関数で文字列の分割

【文字列の部分削除】先頭・末尾・空白

Pythonでは、文字列を先頭(左)から削除するメソッドとして「lstrip」があります。
逆に末尾(右)から削除するメソッドとして「rstrip」があります。
(引数なしでは空白を削除)

# -*- coding: utf-8 -*-

data = "     hello world"
print( data ) #      helloworld

data = data.lstrip()
print( data ) # helloworld

data = data.lstrip("hello")
print( data ) # world
関連記事
1 【Python】文字列の先頭・末尾・空白削除(lstrip、rstrip関数)

【正規表現】reモジュール

正規表現とは、「文字列のパターンを示した式」です。
通常、文字列を探索する場合は、「hello」や「100」などと直接単語や数値を検索します。
しかし、この方法では例えば「5桁以上の数値」というように複雑な場合は探せません。
このような場合に、正規表現を使うと簡単に検索パターンを作って探すことができます。

正規表現の代表的なパターン式は以下の通りです。

パターン式 内容
[ ] [ ] 内に指定した文字のどれかと一致
[^ ] [ ] 内に指定した文字でない場合に一致する
^ 行頭と一致
$ 行末と一致
. 任意の1文字と一致
( ) 正規表現をグループにまとめる
| 前後にある正規表現のいずれかと一致
+ 直前の正規表現の1回以上の繰り返しに一致
? 直前の正規表現に0回 or 1回一致
{m,n} 直前の正規表現のm~n回の繰り返しに一致
+? 直前の正規表現の1回以上の繰り返しに一致
*? 直前の正規表現の0回以上の繰り返しに一致
?? 直前の正規表現に0回もしくは1回一致
* 直前の正規表現の0回以上の繰り返しに一致
{m,n}? 直前の正規表現のm~n回の繰り返しに一致
\ メタ文字を打ち消す
\A 文字列の先頭と一致
\b 単語境界と一致 (\w と \W の間の空文字列と一致)
\B \B 以外と一致
\d 数字と一致 ( [0-9] と同じ )
\D \d以外と一致
\s 空白文字と一致
\S \s 以外と一致
\w 英数字とアンダースコア_に一致
\W \w 以外と一致
\Z 文字列の末尾と一致

例えば、hel[lL]oと書くと、helloとhelLoを探索します。
このように正規表現のパターン式を用いることで、複雑なパターンを簡単に記述できます。

Pythonの標準モジュールreでは、パターン式と一致するデータを探すための関数としてmatch()、search()、findall()、finditer()の4種類が用意されています。
Pythonとreを用いた正規表現による探索のサンプルコードを紹介します。

match

match()は、文字列の先頭でパターンが一致するかを判定します。

# -*- coding: utf-8 -*-
import re

data = 'abcdefghijklmn'

# パターン式の定義(aで始まりcで終わる最短の文字列)
pattern = re.compile(r'a.*?c')

# パターン式との一致判定
match_data = pattern.match(data)

# 一致した文字列を表示
print( match_data.group() )  # abc

search

search()は、パターンと一致する部分があるかどうかを判定します。
一致する部分が複数ある場合は、最初の部分のみ返します。
(matchとの違いは、文字列の先頭でなくても一致の判定をします)

# -*- coding: utf-8 -*-
import re

data = 'abcdefghijklmnabcdefghijklmn'

# パターン式の定義(dで始まりgで終わる最短の文字列)
pattern = re.compile(r'd.*?g')

# パターン式との一致判定
match_data = pattern.search(data)

print( match_data.group() )  # defg:一致したデータ
print( match_data.start() ) # 3:一致した開始位置
print( match_data.end() )  # 7:一致した終了位置
print( match_data.span() )  # (3, 7):一致した位置を表示

findall

findall()は、パターンと一致するすべての部分を判定します。
(search()との違いは、一致した箇所をすべて取得します)
注意点としては、探索結果をオブジェクトでなく配列(リスト)で返します。

# -*- coding: utf-8 -*-
import re

data = 'abcdefghijklmnabcdefghijklmn'

# パターン式の定義(dで始まりgで終わる最短の文字列)
pattern = re.compile(r'd.*?g')

# パターン式との一致判定
match_data = pattern.findall(data)

print( match_data )  # ['defg', 'defg']一致したデータ

finditer

finditerは、パターンと一致する部分を判定します。
これさえあれば、上の3つの関数でできることはすべてできます。


# -*- coding: utf-8 -*-
import re

data = 'abcdefghijklmnabcdefghijklmn'

# パターン式の定義(dで始まりgで終わる最短の文字列)
pattern = re.compile(r'd.*?g')

# パターン式との一致判定
match_datas = pattern.finditer(data)

for match in match_datas:
    print( match.group() )  # 一致したデータ
    print( match.start() ) # 一致した開始位置
    print( match.end() )  # 一致した終了位置
    print( match.span() )  # 一致した位置
    print("---------")

"""
実行結果
defg
3
7
(3, 7)
---------
defg
17
21
(17, 21)
"""
関連記事
1 【Python】正規表現の使い方 (reモジュール)

【chr、ord関数】文字 ↔ アスキーコード

Pythonでは、chr、ord関数で「文字」と「アスキーコード(ascii)」を相互変換できます。

ord_a = ord("a")

print(ord_a) # 97


chr_a = chr(97)
print(chr_a) # a
関連記事
1 【Python】chr・ord関数で「文字」「アスキーコード(ascii)」の相互変換
関連記事
1 【Python入門】文字列の処理・使い方
2 Python入門 基本文法

コメント

  1. y0ma10n0de5k0 より:

    文字列検索の部分に関する質問、失礼します。
    find, index, startswith endwith それぞれ ) が足りないと思うのですが、いかがでしょうか。
    読みやすくて学びやすいので重宝しています。
    ありがとうございます。

    • 管理人 より:

      ※y0ma10n0de5k0様
      コメントありがとうございます。
      ご指摘いただいたとおり、)が抜けておりましたので修正いたしました。
      こちらこそ、ご指摘&応援メッセージをいただきありがとうございます。

  2. タッキー より:

    確認お願いします

    int関数やfloat関数で次のように数値を文字列に変換すると、数値同士の足し算・・・

  3. タッキー より:

    確認お願いします

    【正規表現】reモジュール
    パターン式「|」 、内容「前後にある正規表現のいずれかと一致」