≪いっしょにPython≫ プログラマーの実験ノート

 このページは,プログラム言語Pythonをこれから学ぼうと考えている筆者の備忘録です.
 そこそこ調べて書いていますが,仕様を精密に調べたものではありません.どちらかと言えば,実装されたPython 3を使ってみてどうなったかということを中心に書いたものです.いわば,実験ノートの記録です.

1. Pythonの文字列作成

(1) Pythonの文字列は,
シングルクォート(')またはダブルクォート(")で前後を囲んで作る
のが基本です.(当然,半角のシングルクォート('),ダブルクォート(")のことで,全角のものは目印としては使えません)
【例 1.1.1】
>>> str1 = 'Rome was not built in a day.'
>>> print(str1)
画面への出力は Rome was not built in a day.
(備考)
 前後をシングルクォートで囲んで,文字列を定義し,適当な変数名 str1を定めて代入し,print()関数に引数として渡して画面に出力した例.
 文字列には,全角,半角のスペース,ドット(ピリオド)、カンマなどを含むことができる.
(重要)
 シングルクォート(')で書き始めた文字列は,シングルクォート(')で終らなければならない.
 ダブルクォート(")で書き始めた文字列は,ダブルクォート(")で終らなければならない.
⇒ str1 = 'Rome was not built in a day." はエラーになる.
(2) 文字としてのシングルクォート(')自体またはダブルクォート(")自体を含む文字列を作るには,そうでない側で囲めばよい.
【例 1.1.2】
>>> str1 = 'Rome was't built in a day.'
はエラーになる
>>> str1 = "Rome was't built in a day."
は正常に作動する.
(備考)
 Pythonのシステムに文字列として正常に取り込まれたら,元の文字列がシングルクォート(')で囲まれていたか,ダブルクォート(")で囲まれていたかの区別はない.だから,次のような2つの文字列を文字列連結演算子(+)で連結することは全く問題ない.
>>> str1 = "Rome was't built in a day."
>>> str2 = '(ローマは1日にして成らず)'
>>> print(str1+str2)
画面への出力は Rome was't built in a day.(ローマは1日にして成らず)
(3) 「ほとんどのプログラマーは,文字列はシングルクォート(')で囲むとかダブルクォート(")で囲むというように,どちらかに決めて作業を行うことにより,点検作業を見やすくしているから,データ毎に作業のスタイルを変えたくない」「長い文章を機械的に処理するときには,1つの文字列の中にシングルクォート(')もダブルクォート(")も両方とも含まれることがある」といった事情に対応するには,エスケープ文字(エスケープシーケンス)を利用する方法があります.
 すなわち,円記号(\)と文字を組合せて作られるある記号は,文字列の中で特定の文字を表すように決められているので,これを利用することができます.
(よく使うエスケープ文字)
\n → 改行, \t → タブ(画面上でスペース4文字分とか8文字分字下げして表示する)
\' → シングルクォート(')の文字を表示する, \" → ダブルクォート(")の文字を表示する
\\ → 円記号(\)の文字を表示する
【例 1.1.3】
>>> str3='She said \'I said \"Yes\"\'.'
>>> print(str3)
画面への出力は She said 'I said "Yes".'
「私が『はい』と言いました」と彼女が言った.
(4) トリプルクォート(''')または(""")の利用も可能
 途中に改行を含む複数行にわたる長い文章,シングルクォート(')やダブルクォート(")を含む可能性のある文字列は,トリプルクォート(''')または(""")を利用すれば,1つの文字列として作成することができます.
【例 1.1.2】
>>> str4=''''行ってきます'と言われたら、'車に気を付けて'
というのが、日常的なあいさつです。
"ただいま"と言われたら、"おかえりなさい"
というのも普通のあいさつです。'''
>>> print(str4)
画面への出力は
'行ってきます'と言われたら、'車に気を付けて'
というのが、日常的なあいさつです。
"ただいま"と言われたら、"おかえりなさい"
というのも普通のあいさつです。
(備考)
 文字列自体は,
>>> str4
'\'行ってきます\'と言われたら、\'車に気を付けて\'\nというのが、日常的なあいさつです。\n"ただいま"と言われたら、"おかえりなさい"\nというのも普通のあいさつです。'

のようにエスケープ文字を含む形で保存されており,print()では改行して示されます.
 この例では,シングルクォート(')が4個連なっているように見えるが,トリプルクォート(''')の中にシングルクォート(')があるものと見なされる.
 トリプルクォート(''')のネスト(入れ子)はできないが,必要な場合はエスケープ文字(\''')によってトリプルクォート(''')自体を表す文字として使える.

2. 文字列の連結

 2つ以上の文字列は,文字列連結演算子(+)を使って1つの文字列としてつなぐことができます.
【例 2.1】
>>> str5='雨の降る日は'
>>> str6='天気が悪い'
>>> str7=str5+str6
>>> print(str7)
画面への出力は → 雨の降る日は天気が悪い
(備考)
 1+1は2ですが,数値を表す文字として使った場合,'1'+'1'は'11'です.
 Javascriptでは,1+'1'や'1'+1のように数値と文字列が混ざった場合に連結演算子(+)を使うと,文字列の連結として処理されますが,Pythonでは整数型や小数型の数値と文字列型を演算(+)によって加えるとエラーになります.これは,各々の言語にとって一長一短だと思われます.すなわち,Javascriptでは許容範囲を広げることによってエラーが少なくなる代わりに,例えばユーザが数値を入力したときに,数値を表す文字を入力したと解釈されるのを防ぎ, 必ず数値と解釈されるように,式に *1 を付加するとか( )で囲むという安全策が必要となるのに対して,Pythonでは単にエラーとなってシステムが止まるということになります.
 文字列に対する演算子としては,(−)や(/)はありません.演算子(*)は後で述べるように,後ろが整数値であるときに,例外的にて定義されます.

3. 文字列の繰り返し

文字列 * 回数
回数 * 文字列
の形で,回数に正の整数値を指定すれば,その文字列を指定した回数だけ繰り返した文字列を作ることができます.
【例 3.1】
>>> str3='こんにちは' * 2
>>> str4=3 * 'こんばんは'
>>> print(str3, str4)
>>> print(str3+str4)
画面への出力は → こんにちはこんにちは こんばんはこんばんはこんばんは
画面への出力は → こんにちはこんにちはこんばんはこんばんはこんばんは
(備考)
 'こんにちは' * 2 や,2 * 'こんにちは'で,こんにちはこんにちは になります.
 'こんばんは' * 3 で,こんばんはこんばんはこんばんは になります.
 print(str3, str4)のように,print()関数にカンマ(,)で区切って2つ以上の引数を渡すと,スペース区切りで出力されます.
 これに対して,print(str3+str4)のように文字列の結合を行った場合は,区切りなくつながった文字列が出力されます.
 回数として小数や分数を指定すれば,エラーになります.回数として0または負の整数を指定すれば,エラーにはなりませんが,空文字('')になります.
【例 3.2】
>>> str3='こんにちは' * 1.5
→ エラー
>>> str3='こんにちは' * 0
>>> str3
画面への出力は → ''
>>> str3= -1 * 'こんにちは'
>>> str3
画面への出力は → ''

4. 文字列の一部の取り出し

(1) 正(または0)の番号を使って文字を取り出す

文字列[番号]
の形で,文字列の(先頭を0番とする)左からの番号で1文字を取り出すことができる.(この番号は,オフセット,インデックスとも呼ばれる.)
【例 4.1.1】
>>> str4="ABCDEFG"
>>> str4[0]
画面への出力は → 'A' (元がダブルクォートであっても,シングルクォート付き)
>>> print(str4[1])
画面への出力は → B (print()を使えばシングルクォートなし)
 この[番号](オフセット,インデックス)は文字列の先頭からのバイト数ではなく,1バイト文字(アスキーの英数字)と2バイト文字(漢字かなカナ)が混じっていても,先頭を0番とする番号で文字を取り出すことができる.
【例 4.1.2】
>>> str4='あいうえabcd'
>>> print(str4[2])
画面への出力は → う

(2) 負の番号を使って文字を取り出す

 s1 = 'abcdefghijklmnopqrstuvwxyz'のように長い文字列の末尾の方の文字は前から何番目であるかと数えにくいことがある.
 ところで,文字列の番号は先頭を0として数えるので,長さがnの文字列の末尾は第n−1番になる.
 ここで,文字列str1の長さを返す関数len(str1)を使えば,上記の文字列s1の末尾はlen(s1)−1番目であるから,末尾の文字はs1[len(s1)−1]で取り出すことができる.
 Pythonでは,このような場合に負の番号を使って文字を取り出すことができる.次の表のように対応している.
s1 = 'abcdefghijklmnopqrstuvwxyz'のとき
s1[0]s1[1]s1[2]s1[n−2]s1[n−1]
s1[−n+0]s1[−n+1]s1[−n+2]s1[−2]s1[−1]
※(上の段)正の番号からnを引くと(下の段)負の番号になる.
 文字列s1の長さがnのとき,s1[番号]の番号に指定できる整数は,−n〜−1および0〜n−1の範囲
番号<−nや番号≧nを指定するとエラーになる
【例 4.2.1】
>>> s1 = 'abcdefghijklmnopqrstuvwxyz'
>>> s1[−1]
画面への出力は → 'z'
>>> s1[−26]
画面への出力は → 'a'
>>> s1[26]
→ エラー
>>> s1[-27]
→ エラー

(3) [start:stop:step]による文字列の一部の取り出し(スライス)

 s1 = 'abcdeFGHIJ'のとき,先頭を0番として,番号と文字は次のように対応している.
正(0)の番号[0][1][2][3][4][5][6][7][8][9]
負の番号[−10][−9][−8][−7][−6][−5][−4][−3][−2][−1]
文字abcdeFGHIJ
 この文字列を例にとって,解説する.
文字列[start:stop:step]
• start番目から,stop番目の前まで,stepずつの増分で取り出す
• stopは個数ではなく番号,またstop自身は含まれない
• stepを負にして左向きに(逆順に)取り出すこともできる
【例 4.3.1】
>>> s1 = 'abcdeFGHIJ'
>>> s1[1:7:1]
→ 'bcdeFG' (1番のbから,7番の手前の6番のGまで,1つずつ取り出す)
>>> s1[−1:−9:−2]
→ 'JHFd' (−1番のJから,−9番の手前の−8番のGまで,−2ずつ進む)
>>> s1[−9:4:1]
→ 'bcd' (−9番=1番のbから,4番の手前の3番のdまで,1ずつ進む)
(−6≦k≦0までは無視される)
>>> s1[5:3:1]
→ '' (5番から,1ずつ進んでも3番になるまで→エラーでなく空文字が返される)
>>> s1[0:9:1]
→ 'abcdeFGHI'
(先頭から,最後の番号まで,1つずつ取り出しても,最後の文字(J)はとりだせない←stopの番号の前までだから)
(以下は,かなり意外なこと)
後で述べるように,stopを省略すれば末尾まで表示されるが,stopを省略せずに書き込んで,かつ末尾まで取り出すには,s1[0:10:1]やs1[0:11:1]のように,stopとして文字列の末尾の番号よりも大きな番号を指定するとよい.
>>> s1[0:100:1]
→ 'abcdeFGHIJ'
>>> s1[0:0:1]
→ '' (こちらは空文字になる)
文字列[start:stop:]
文字列[start:stop]
• stepが省略された場合や,さらに2番目のコロン(:)も省略された場合は,stepは既定値の1になる.
start番目から,stop番目の前まで,1ずつの増分で取り出す
【例 4.3.2】
>>> s1 = 'abcdeFGHIJ'
>>> s1[3:6:]
→ 'deF' (3番のdから,6番の手前の5番のFまで,1つずつ取り出す)
>>> s1[4:7]
→ 'eFG' (4番のeから,7番の手前の6番のGまで,1つずつ取り出す)
>>> s1[4:0]
→ '' (4番から,1ずつ進んでも0番になるまで→エラーでなく空文字が返される)
>>> s1[1:−6]
→ 'bcd' (1番のbから,−6番=4番の手前の3番のdまで,1つずつ取り出す)
文字列[start::step]
文字列[start::]
文字列[start:]
• stopが省略された場合は,stopは既定値として末尾の次になり,末尾まで表示される.
• コロン(:)が1つのときは,1番目のコロンが書かれているものと見なす.
【例 4.3.4】
>>> s1 = 'abcdeFGHIJ'
>>> s1[5::2]
→ 'FHJ' (5番のFから,末尾まで,1つ置きに取り出す)
>>> s1[6::]
→ 'GHIJ' (6番のGから,末尾まで,1つずつ取り出す)
>>> s1[7:]
→ 'HIJ' (7番のHから,末尾まで,1つずつ取り出す)
>>> s1[:2]
→ 'ab' (コロン(:)が1つのときは,1番目のコロンが書かれているものと見なすから,s1[0:2:1]の省略と見なす)
文字列[:stop:step]
文字列[::]
文字列[:]
• startが省略された場合は,startは既定値の0になり,先頭から表示される.
【例 4.3.5】
>>> s1 = 'abcdeFGHIJ'
>>> s1[:-6:1]
→ 'abcd' (先頭から,−6番=4番の手前の3番のdまで,1つずつ取り出す)
>>> s1[::]
→ 'abcdeFGHIJ' (先頭から,末尾まで,1つずつ取り出す→順に全部取り出す)
>>> s1[:]
→ 'abcdeFGHIJ' (先頭から,末尾まで,1つずつ取り出す→順に全部取り出す)
>>> s1[2]
→ 'c' (4.(1)で述べた1文字の取り出しになる)
>>> s1[]
→ エラー
※スライス [start:stop:step]の既定値について筆者の感想
(今のところ,以下の内容を裏付けられる他の文献が見つからないので「筆者の感想」とします)
 スライスにおける既定値の基本として,次のように覚えると,ほとんどの場合に実装されているPythonのシステムの動きと一致する.
文字列[start:stop:step]
• startが省略されていれば,start=0として先頭の番号を既定値とする.
• stopが省略されていれば,stop=len(文字列)として末尾の番号の次が既定値になり,その1つ前の末尾まで取り出される.
• stepが省略されていれば,step=1として,前から順に取り出される
 start,stop,stepの値が指定されればその値を使い,省略されれば =の右辺を既定値として使うということを,次の記号で表すことにする.
文字列[start=0:stop=len(文字列):step=1]
 ただし,次のような場合に,上記の基本の解釈では説明し切れないと思われる.
 すなわち,stepが正の整数のときは,上記の基本通りに解釈できるが,stepが負の整数の場合は,そうとは限らない.
 つまり,stepを先に評価して,その正負に応じて,その向きに進む場合の端から端までを表すように,start, stopの既定値が決まる.
【詳細】
step>0のとき
文字列[start=0:stop=len(文字列):step]
すなわち
文字列[start=先頭の番号:stop=末尾の次の番号:step]
step<0のとき
文字列[start=−1:stop=−len(文字列)−1:step]
すなわち
文字列[start=末尾の番号:stop=先頭の前の番号:step]
【例】
>>> s1 = 'abcdeFGHIJ'
>>> s1[:−11:−1]
→ 'JIHGFedcba'
stepが−1のとき,startが省略されたら,既定値を末尾の番号(−1)とした場合に等しい結果になる
>>> s1[−1::−1]
→ 'JIHGFedcba'
stepが−1のとき,stopが省略されたら,既定値を先頭番号の前の番号(−11)とした場合に等しい結果になる
>>> s1[::−1]
→ 'JIHGFedcba'
stepが−1のとき,startは末尾の番号(−1), stopは先頭の前の番号(−11)とした場合に等しい結果になる
次の結果も,この解釈で説明がつけられる.
>>> s1[:0:−2]
→ 'JHFdb'
>>> s1[5::−2]
→ 'Fdb'
>>> s1[::−3]
→ 'JGda'

5. 文字列の一部の書き換え

 文字列を定義してから,後で文字列を書き換えることのできる言語もある(C言語やjavascriptでは書き換えられる,ミュータブル:mutable)が,Pythonでは文字列は書き換えられない(イミュータブル:immutable)オブジェクトとして定義されている.
 そこで,いったん定義された文字列の中の1文字に,他の文字を「直接に代入しようとする」とエラーになる.
>>> s1 = 'abcdeFGHIJ'
>>> s1[5] = 'f'
→ エラー
 後に述べる文字列操作関数を利用しても,文字列の書き換えを行うことができるが,次のように文字列そのものを「再定義する」(文字列のコピーを代入して,文字列全体を定義し直す)と,文字列の書き換えと同じ効果が得られる.
上記の文字列の5番目の文字を小文字のfに書き換えるには
>>> s1 = 'abcdeFGHIJ'
>>> s1 = s1[:5]+'f'+s1[6:]
>>> s1
→ 'abcdefGHIJ'

6. 文字列操作の組み込み関数

 pythonで文字列操作に使える組み込み関数(ビルドイン関数,Pythonのシステムであらかじめ用意されていて,ユーザ各自が定義しなくてもそのまま使える関数)の幾つか

(1) len(str) … 文字列の長さを返す

 この関数len()は,オブジェクトの長さ (要素の数) を返し,引数には文字列だけでなく,シーケンス (文字列,タプル,リスト,rangeなど)およびコレクション (辞書,集合,など)にも使える.
【書式】
len(要素数を調べたい文字列の名前)
【例 6.1】
>>> s1 = 'abcdeFGHIJ'
>>> len(s1)
→ 10
>>> len(s1[::3])
→ 4 (2つ置きに取った文字列 adGJ の長さは4)

(2) split('目印の文字') … 文字列を分割する

【書式】
文字列.split('目印の文字')
• 元の文字列中の'目印の文字'をセパレーターとして文字列を分割して,カンマ(,)区切りのリストが作られる.
• 新たにリストが作られ,split()を使っただけでは元の文字列は変化しない.
【例 6.2.1】
>>> str6 = 'Rome was not built in a day.'
>>> list1 = str6.split(' ')
→ ['Rome', 'was', 'not', 'built', 'in', 'a', 'day.']
[半角スペース(' ')を区切り文字として指定すると,半角文字を取り除いたカンマ(,)区切りのリストが作られる.]
【書式】
文字列.split()
• セパレータの'目印の文字'を省略すると,デフォルト(既定値)として半角スペース(' ')が区切り文字として用いられる.
 ただし,半角スペース(' ')をセパレータに指定した場合には,厳格に1つの半角スペース(' ')で1つの区切りができるのに対して,セパレータを省略した場合には半角スペース(' ')が幾つかつながっている場合にも,まとめて1つの区切りとなる.
 さらに,引数なしのデフォルト(既定値)で使うと,先頭の余分なスペース,全角スペース,印字されない空文字(タブ,改行など)も取り除いて1つの区切りになる.
【例 6.2.1】
>>> str6 = 'Rome was__not built___in a day.'
(書き手の気分次第で,wasの後にスペースが2個,buildの後にスペースが3個入っている場合)
>>> str6.split(' ')
→ ['Rome', 'was', '', 'not', 'built', '', '', 'in', 'a', 'day.']
(繰り返される半角スペース(' ')のうちの1つは区切り文字として取り除かれるが,残りは半角スペース(' ')という文字となる)
>>> str6.split()
→ ['Rome', 'was', 'not', 'built', 'in', 'a', 'day.']
(セパレータを省略すると,半角スペースが複数個つながっている場合も1つの区切りと見なされる)
>>> str6 = 'Rome was not built in a day.'
(wasの後に全角スペース(2バイト文字)を入れてしまった場合)
>>> str6.split(' ')
→ ['Rome', 'was\u3000not', 'built', 'in', 'a', 'day.']
(セパレータとして半角スペース(' ')を指定すると,全角スペースは区切りとはならず,UTF-8の漢字コード\u3000になる)
>>> str6.split()
→ ['Rome', 'was', 'not', 'built', 'in', 'a', 'day.']
(セパレータを省略すると,半角スペースも全角スペースも区切り文字と見なされる)
>>> str7 = '  Rome was\tnot built\nin a\t\nday.'
(先頭に全角スペースと半角スペースが隣り合っており,wasの後ろにタブコード,buildの後に改行コード,aの後にタブと改行が隣り合っている)
→ ['Rome', 'was', 'not', 'built', 'in', 'a', 'day.']
(セパレータを省略すると,全角,半角のスペース,タブ,改行が複数個つながっている場合も1つの区切りと見なされる)
【書式】
文字列.split(sep=None, maxsplit=−1)
• split()関数の第1引数はセパレータとする目印の文字で,第2引数として最大分割回数を整数値で指定できます.
• 最大分割回数をn個にすると,植木算の仕組みでリストの要素数は最大でn+1個になります.
• 何らかの都合で最大分割回数を指定して,実際にはそれよりも多い区切り文字があるとき,後ろにある超過する部分はまとめて1つの要素に入ります.
• 最大分割回数が省略されたときは,制限なく分割されますが,その場合は引数として−1が使われています.
• 第2引数も指定するときに,第1引数を省略するとエラーになって,ここまでに述べたセパレータ省略の長所が利用できませんが,これを防ぐには第1引数としてNoneを指定するとよい.(NoneはTrueやFalseと同様に記号定数で,クォーテンションマークなしで直接書きます.先頭は大文字でなければなりません.)
【例 6.2.2】
>>> str1=' Rome was not build in a day. '
(Romeの前に余計なスペースがある.この文を5個まで分割したい.)
>>> str1.split(' ',4)
→ ['', 'Rome', 'was', 'not', 'build in a day. ']
>>> str1.split(None,4)
→ ['Rome', 'was', 'not', 'build', 'in a day. ']

(3) 'str'.join(list) … 文字列を結合する

 split()の逆の操作です.
 このメソッド(オブジェクトの中に定義されている関数)は,書き方がとても奇妙に見えます.
 すなわち,先頭に書く(str)はオブジェクトの名前でなく,文字列を挟むために使う文字列です.listのところには,文字列を要素とするリスト型のデータを書きます.
【書式】
文字列.join(文字列から成るリスト)
• 元の文字列中の'目印の文字'をセパレーターとして文字列を分割して,カンマ(,)区切りのリストが作られる.
【例 6.3.1】
>>> str1='Rome was not build in a day.'
>>> list1 = str1.split()
>>> list1
→ ['Rome', 'was', 'not', 'built', 'in', 'a', 'day.']
>>> ' '.join(list1)
→ 'Rome was not built in a day.' (元のスペース区切りの文字列に戻せる)
>>> ''.join(list1)
→ 'Romewasnotbuiltinaday.' (空白を詰めた文字列ができる)
>>> ' - '.join(list1)
→ 'Rome - was - not - built - in - a - day.' (スペース,ハイフン,スペースの3文字( - )でつないだ文字列ができる)
>>> str2='\n'.join(list1)
>>> print(str2)
Rome
was
not
built
in
a
day.
(単語ごとに改行できる)

(4) 文字列.upper() … 小文字を大文字に変える

【書式】
文字列.upper()
• 元の文字列中に英字,ギリシャ文字,ローマ数字のように大文字と小文字の区別のある文字が含まれるとき,小文字を大文字に変えます.
(このメソッド(関数)と同様の関数は,他の様々な言語にもあります.英大文字は英小文字よりも文字コードが32[0x20]だけ小さいので,各文字コードを−32[−0x20]しているように見えますが,Pythonでは元の文字列に「大文字が含まれる場合」「大文字小文字の区別がない場合」「全角文字が含まれる場合」にも対応しています)
【例 6.4】
>>> str1='abc'
>>> str1.upper()
→ 'ABC' (英小文字は英大文字になります)
>>> str2='ABC'
>>> str2.upper()
→ 'ABC' (英大文字は変更されません)
>>> str3='0123., あいう'
>>> str3.upper()
→ '0123., あいう' (大文字,小文字の区別がない文字は変更されません)
>>> str4='abcABC'
>>> str4.upper()
→ 'ABCABC' (全角文字も小文字は大文字になり,大文字は変化しません)
>>> str5='αβγΓΔ'
>>> str5.upper()
→ 'ΑΒΓΓΔ' (ギリシャ文字も小文字は大文字になり,大文字は変化しません)
>>> str6='@ABTUV'
>>> str6.upper()
→ 'TUVTUV' (ローマ数字も小文字は大文字になり,大文字は変化しません)
※この他,á, ì, ëなどの発音記号にも丁寧に対応しているようです.
>>> str7='大小きゃしゅチェニョ'
>>> str7.upper()
→ '大小きゃしゅチェニョ' (これらは変わりません.ジョークでした.)

(5) 文字列.lower() … 大文字を小文字に変える

【書式】
文字列.lower()
• upper()の逆です
【例 6.5】
>>> str1 = '123.0abcABCあいうアイウabcABCωφθΩΦΘ@ABTUV'
>>> str1.lower()
→ '123.0abcabcあいうアイウabcabcωφθωφθ@AB@AB'
(大文字は小文字になり,全角大文字も全角小文字になり,すでに小文字である文字や大文字小文字の区別のない文字は変わりません.)

(6) 文字列1.count(文字列2) … 文字列1に含まれる文字列2の個数を数える

【書式】
文字列1.count(文字列2)
【例 6.6】
>>> str1 = 'A certain man had a donkey, which had carried the corn-sacks to the mill indefatigably for many a long year; but his strength was going, and he was growing more and more unfit for work. Then his master began to consider how he might best save his keep; but the donkey, seeing that no good wind was blowing, ran away and set out on the road to Bremen. "There," he thought, "I can surely be town-musician." When he had walked some distance, he found a hound lying on the road, gasping like one who had run till he was tired. "What are you gasping so for, you big fellow?" asked the donkey.' (グリム童話集「ブレーメンの音楽隊」の第1段落)
>>> str1.count('a')
→ 40 (この数え方では,man, hadのような単語の中のaも全部数える)
>>> str1.count(' a ')
→ 3 (不定冠詞のaを数えるには,この形.ただし、先頭のAは数えられていない)
>>> str1.count('the')
→ 6 (たまたま,Then, Thereなどが大文字で始まるためカウントされなかった)
>>> str1.count('e')
→ 49 (英語では,通常eが最も多くなる)

(7) 文字列1.replace(旧文字列, 新文字列, 回数) … 文字列1に含まれる旧文字列を新文字列に書き換える

【書式】
文字列1.replace(旧文字列, 新文字列, 回数)
• テキストエディタ,WordやExcelなどにある「置換」という機能と同じです.
• 第3引数の回数は省略でき,第3引数が省略された場合は,旧文字列に該当する部分文字列はすべて新文字列に書き換えられる.
• 第3引数の回数が正の整数nで与えられた場合,文字列1の左端からn個まで書き換えられる(旧文字列がn個よりも少なければ全部書き換えられる)
• replace()は元の文字列1を書き換えたコピーとしての文字列を返し,元の文字列は変化しない.
【例 6.7】
>>> str1 = 'おはよう。こんにちは。こんばんは。'
>>> str1.replace('。','.')
→ 'おはよう.こんにちは.こんばんは.' (。がすべて.に書き換えられる)

>>> str1.replace('。','.',2)
→ 'おはよう.こんにちは.こんばんは。' (初めから2個までの。が.に書き換えられる)
>>> str1.replace('。','.',4)
→ 'おはよう.こんにちは.こんばんは.' (2≦4だから全部書き換えられる)

>>> str2 = str1.replace('。','.')
>>> str1
→ 'おはよう。こんにちは。こんばんは。' (str1は変化しない)
>>> str2
→ 'おはよう.こんにちは.こんばんは.' (コピーで作られたstr2は書き換わっている)

(8) 文字列1.find(sub, start, end) … 文字列1の中で,オフセット(左端を0番とした文字の番号)がstart以上end未満の位置で最初に見つかる部分文字列subのオフセット

【書式】
文字列1.find(sub, start, end)
文字列1.index(sub, start, end)
• strat, endは省略できる.
• startを省略すれば既定値で文字列の先頭番号0から探す.endを省略すれば文字列の末尾の次len(文字列1)を指定したのと同じになる.startとendの両方を省略すれば,文字列の全体から探す.
• 部分文字列subが見つからなかったときは,−1が返される.
• 文字列1の中に部分文字列が「有るか無いか」だけならば,in演算子で調べられる.
• 文字列1.index(sub, start, end)によって,文字列1.find(sub, start, end)とほぼ結果が得られるが,部分文字列subが見つからなかったときエラーとなる点が異なる.
【例 6.8】
>>> str1 = 'A certain man had a donkey'
>>> str1.find('a')
→ 6 (A0_1c2e3r4t5a6i7n8 最初のaは6番目にある)
>>> str1.find('a', 7)
→ 11 (A certain man 7番目以降にある最初のaは11番目)

>>> str1.find('a',20,30)
→ −1 (20番目のdonkeyのdの後にaはない)

>>> 'a' in str1
→ True (有ればTrueが返される[場所は分からない])
>>> 'C' in str1
→ False (小文字のcはあるが大文字のCはないからFalseが返される)
>>> str1.index('a', 7)
→ 11
>>> str1.index('C')
→ エラー

(9) 文字列1.rfind(sub, start, end) … 文字列1の中で,オフセット(左端を0番とした文字の番号)がstart以上end未満の位置で「一番右」に見つかる部分文字列subのオフセット

【書式】
文字列1.rfind(sub, start, end)
文字列1.rindex(sub, start, end)
• 文字列1.find(sub, start, end), 文字列1.index(sub, start, end)と同様であるが文字列の右側から(後ろから)検索する
【例 6.9】
>>> str1 = 'A certain man had a donkey'
>>> str1.rfind('a')
→ 18 (A certain man had a donkey)
>>> str1.rindex('C')
→ エラー

(10)
文字列1.isdecimal(), 文字列1.isdigit(), 文字列1.isnumeric()

【書式】
文字列1.isdecimal()
文字列1.isdigit()
文字列1.isnumeric()
※ unicodeは日進月歩と言われていますが,2019年3月3日現在,実装されているPython 3のシステムでは,次のようになります.
• isdecimal() … decimal(10進数)であるか否かを調べる.次の表の背景色がピンク色の範囲にある文字に対してTrueを返し,それ以外にはFalseを返す.
• isdigit() … digit(数字)であるか否かを調べる.次の表の背景色が黄色の範囲にある文字に対してTrueを返し,それ以外にはFalseを返す.
• isnumeric() … numeric(数字に関するもの)であるか否かを調べる.次の表の背景色が水色の範囲にある文字に対してTrueを返し,それ以外にはFalseを返す.
• decimalに入るものは,digitにも入り,digitに入るものはnumericにも入る.
【decimal】
0,1,2,…, 9 半角アラビア数字(10進数)
0, 1, 2, …, 9 全角アラビア数字(10進数)
【digit】
@, A, …, H 9までの丸数字
⑴, ⑵, …, ⑼ アラビア数字の囲み文字(9まで)
⒈, ⒉, …, ⒐ 点付きの数字
【numeric】
T, U, … ,] ローマ数字(大)
@, A, … ,I ローマ数字(小)
〇, 一, 二, … , 十 漢数字
零, 壱, 弐, 参, 拾, 廿, 卅 漢数字の大字
百, 千, 万, 萬, 億, 兆 大きい方の補助単位
I, J, … 10以上の丸数字
⑽, ⑾, …, ⒆ 10以上の囲み数字
㈠ ㈡, …, ㈩ 漢数字の囲み文字
㊀ ㊁, …, ㊉ 漢数字の丸数字
⅐ ⅑, …, ⅚ 分数記号
【数ではない文字】
. 小数点
− マイナスの符号
 半角スペース
 空文字
けい)以上の大きい方の補助単位
分, 厘, 毛, … 漠(10分の1以下の補助単位)
【例 6.10.1】
>>> str1 = '01234567890123456789'
>>> print(str1.isdecimal(),str1.isdigit(),str1.isnumeric())
→ True True True (str1は,すべてdecimalかつdigitかつnumeric)
【例 6.10.2】
>>> list1 = ['@','A','H','\u2474','\u2475','\u247c','\u2488','\u2490']
(16進数のunicodeをPythonに渡すには,先頭に\uを付ける)
>>> for kk in list1:
   print(kk,kk.isdecimal(),kk.isdigit(),kk.isnumeric())

@ False True True
A False True True
H False True True
⑴ False True True
⑵ False True True
⑼ False True True
⒈ False True True
⒉ False True True
⒐ False True True
(list1の各要素は,すべてdecimalでなく,かつdigitであり,かつnumericである)
【例 6.10.3】
>>> list2=['T','@','〇','零','百','I','\u247d','\u3220','\u3280','\u2150']
>>> for kk in list2:
    print(kk,kk.isdecimal(),kk.isdigit(),kk.isnumeric())

T False False True
@ False False True
〇 False False True
零 False False True
百 False False True
I False False True
⑽ False False True
㈠ False False True
㊀ False False True
⅐ False False True
(list2の各要素は,すべてdecimalでなく,かつdigitでなく,かつnumericである)
【例 6.10.4】
>>> list3=['.','-',' ','','京','分']
>>> for kk in list3:
    print(kk,kk.isdecimal(),kk.isdigit(),kk.isnumeric())

. False False False
- False False False
False False False
False False False
京 False False False
分 False False False
(list3の各要素は,すべてdecimalでなく,かつdigitでなく,かつnumericでない)

(11) 文字列1.isascii(), 文字列1.isalpha(), 文字列1.isalnum()

文字列1の全部が0〜0x7Fまでのアスキー文字(1バイト文字)か
文字列1の全部が半角または全角のアルファベット,漢字,かな,カナであるか
文字列1の全部が漢字,かな,カナ,数字に関するものか
に応じて,True, Falseを返す
【書式】
文字列1.isascii()
文字列1.isalpha()
文字列1.isalnum()

• alphaはアルファベットよりもはるかに広い範囲になっていて,数字以外で読める文字は全部alphaと考えるとほぼ合う.
• alphaに入るものは,必ずalnumに入るので,alphaであってかつalnumでないもの(図の灰色の部分)はない.
• どれにも入らないのは,全角の演算記号など.
• 半角カタカナもalpha,alnumに入る.
【例 6.11.1】
>>> list4=['a','b','0','1','*','/','A','B','α','Ω','あ','ア','ア','鈴','田','0','1','U','B','I','*','/','#']
>>> for kk in list4:
    print(kk,kk.isascii(),kk.isalpha(),kk.isalnum())

a True True True
b True True True
0 True False True
1 True False True
* True False False
/ True False False
A False True True
B False True True
α False True True
Ω False True True
あ False True True
ア False True True
ア False True True
鈴 False True True
田 False True True
0 False False True
1 False False True
U False False True
B False False True
I False False True
* False False False
/ False False False
# False False False
○== メニューに戻る ==