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入門 基本文法 |
コメント
文字列検索の部分に関する質問、失礼します。
find, index, startswith endwith それぞれ ) が足りないと思うのですが、いかがでしょうか。
読みやすくて学びやすいので重宝しています。
ありがとうございます。
※y0ma10n0de5k0様
コメントありがとうございます。
ご指摘いただいたとおり、)が抜けておりましたので修正いたしました。
こちらこそ、ご指摘&応援メッセージをいただきありがとうございます。
確認お願いします
int関数やfloat関数で次のように数値を文字列に変換すると、数値同士の足し算・・・
ご指摘ありがとうございます。修正しました。
確認お願いします
【正規表現】reモジュール
パターン式「|」 、内容「前後にある正規表現のいずれかと一致」
ご指摘ありがとうございます。