2020年12月25日
文字列
記事内容の出典:フリーテキスト「Python3入門」
このページの更新:2020/12/29
文字列型(str型)
数値データとは別に,文字列は文章やメッセージといった「テキストデータ」を表現するためのデータ構造です.文字列はシングルクオート「'」あるいはダブルクオート「"」で括って記述しますが,どちらを使ってもかまいません.(次の例)
シングルクオートによる入力:
'Python'
実行結果:
'Python'
ダブルクオートによる入力:
"パイソン"
実行結果:
'パイソン'
この実行例からわかるように,基本的に文字列はシングルクオート「'」で括った表現です.
シングルクオートやダブルクオート自体を文字列の中に含む場合は「'」「"」使い分けます.(次の例)
s1 = "ab'cd'ef"
s2 = 'ab"cd"ef'
print( s1 )
print( s2 )
実行結果:
ab'cd'ef
ab"cd"ef
またこの実行例からわかるとおり,print で文字列を出力した場合は,前後のクオートは表示されません.
エスケープシーケンス(制御文字列)
文字列の中にエスケープシーケンスと呼ばれる特殊な制御文字列を挿入すると print などで出力する際の様々な効果(制御)を実現することができます.エスケープシーケンスは半角の日本円記号「¥」あるいはバックスラッシュ「\」で始まるものです.
■ 改行制御「\n」
エスケープシーケンス「\n」を含む文字列を print で出力すると次のようになります.
s = 'あいうえお\nかきくけこ'
print( s )
実行結果:
あいうえお
かきくけこ
このように「\n」の部分で改行されて表示されます.ただし print を介さずに直接的に文字列の内容を照会した場合は表示の制御は実行されません.また,前後のクオートも表示されます.(次の例)
s
実行結果:
'あいうえお\nかきくけこ'
■ TAB区切り制御「\t」
エスケープシーケンス「\t」を含む文字列を print で出力すると次のようになります.
print('A\tB')
実行結果:
A B
一見すると「空白がたくさん挿入された」ように見えますが,「\t」があると固定された水平位置まで間隔を空ける制御が施されます.この例では「A」の表示の次に8の整数倍の位置まで間隔が空けられた位置に「B」が表示されています.(表示する端末によっては4の整数倍の位置となります)
「\t」の効果を更に別の例で確かめましょう.(次の例)
print('\tWWW')
print('**\tWWW')
print('****\tWWW')
print('******\tWWW')
print('********\tWWW')
print('**********\tWWW')
実行結果:
WWW
** WWW
**** WWW
****** WWW
******** WWW
********** WWW
この例では,はじめに「*」がいくつか表示した後に「\t」を置き,更にその後に「WWW」を表示した例です.このように「\t」があると,その次は8の倍数の位置まで間隔が空けられます.(表示端末によっては4の倍数位置になります)
■ UNICODE指定の文字表現「\uHHHH」
「\u」に続いて16進数4桁のUNICODEの文字コードを記述すると,該当する文字となります.(次の例)
'\u8a00\u8a9e'
実行結果:
'言語'
これは,「言」の文字コード8a00と「語」の文字コード8a9e(ともに16進数表現)から「言語」という文字列を作った例です.
■ クオート文字自体「\'」「\"」
シングルクオートやダブルクオート自体を「\'」「\"」で表現できます.これを応用すると,2種類のクオート文字が混在する文字列を構成することができます.(次の例)
s = 'これは\'シングルクオート\'でこれは\"ダブルクオート\"で括っています'
print( s )
実行結果:
これは'シングルクオート'でこれは"ダブルクオート"で括っています
■ 「\」自体の記述「\\」
文字列中に半角の「\」(日本円記号もしくはバックスラッシュ)を含める試みを下に示します.
s1 = '価格は\1000です'
print(s1)
実行結果:
価格は@0です
「\」は表示制御のための記号として機能するため,このように変な表示になってしまいました.
文字列中に半角の「\」(日本円記号もしくはバックスラッシュ)を含める場合は「\\」と記述します.(次の例)
s2 = '価格は\\1000です'
print(s2)
実行結果:
価格は\1000です
raw文字列
エスケープシーケンスの働きを気にせずに「記述したままの文字列」を入力するにはraw文字列の形式で文字列を入力します.raw文字列はクオートの直前に「r」を付けます.(次の例)
s3 = r'価格は\1000です'
print(s3)
実行結果:
価格は\1000です
ただし,raw文字列で入力しても,出来上がった文字列オブジェクトは通常の文字列です.上の例の変数 s3 の内容を直接的に照会するとそれが確認できます.(次の例)
s3
実行結果:
'価格は\\1000です'
複数行に渡る文字列の記述
クオート文字3つで括ると複数行に渡る文字列を簡潔に入力することができます.(次の例)
'''あいうえお
かきくけこ
さしすせそ'''
実行結果:
'あいうえお\nかきくけこ\nさしすせそ'
スライス(添字)による部分へのアクセス
文字列を構成する特定の文字や特定の部分文字列を取り出すには,その文字列の直後に四角い括弧 [ ] を付けて参照します.例えば次のような文字列を作成します.
s = '零一二三四五六'
変数 s の文字列の指定位置の文字を取り出す例を次に示します.
print( s[0] )
print( s[6] )
実行結果:
零
六
このように,文字列の構成要素の位置はインデックスと呼び0から始まる整数で指定します.また四角い括弧 [ ] で括ったものをスライスと呼びます.
部分文字列を取り出すには次のようなスライスを文字列の直後に付けます.
[ n1 : n2 ]
これで「n1からn2未満の位置」の部分を参照することができます.(次の例)
s[3:5]
実行結果:
'三四'
つまり,文字列 s のインデックス位置3番目から5番目未満(要するに4番目まで)の部分を参照したわけです.
要素の範囲指定において「飛び飛びの要素」を取り出すことができます.その場合は次のようなスライスを記述します.
[ n1 : n2 : 増分 ]
この記述によりインデックス位置「n1」から始まり「n2」未満までの区間で「増分」の間隔で要素に参照します.使用例を次に示します.
s[1:7:2]
実行結果:
'一三五'
スライスの記述 [ n1 : n2 : 増分 ] において,n1 の記述を省略すると n1 は 0 とみなされ,n2 の記述を省略すると最終要素までの範囲が取られます.(次の例)
print( s[:3] )
print( s[3:] )
実行結果:
零一二
三四五六
参考)今回の例で s[:] とすると全要素が対象となります.
スライスに与える数値として負(マイナス)の値を与えると「末尾から数えた位置」とみなされます.(次の例)
print( s[-1] )
print( s[-2] )
print( s[-3] )
実行結果:
六
五
四
このようにスライスの「-1」は末尾の要素,「-2」は末尾から2番目の要素を意味します.
要素の存在しないインデックス位置を参照しようとすると「IndexError」というエラーが発生します.(次の例)
s[7]
実行結果:
IndexError Traceback (most recent call last)
〈ipython-input-115-b035325af127〉 in()
----> 1 s[7]
IndexError: string index out of range
文字列の長さ(文字数)の算出
len 関数を使うと文字列の長さ(文字数)を算出することができます.(次の例)
len(s)
実行結果:
7
文字列の連結,繰り返し,分解
「+」による加算の形で文字列を連結することができます.(次の例)
'abc' + 'def'
実行結果:
'abcdef'
また,「*」による乗算の形式で文字列を繰り返すことができます.(次の例)
'abc' * 3
実行結果:
'abcabcabc'
■ 文字列の分解 (1)
文字列に対して split メソッドを実行することで分解することができます.(次の例)
s = 'ab cd ef\tgh\t\tij'
s.split()
実行結果:
['ab', 'cd', 'ef', 'gh', 'ij']
このように空白文字を区切りとして文字列を分解してリストの形にします.エスケープシーケンスのTAB「\t」も空白文字とみなされます.
空白以外のものを区切り文字とするには split の引数にそれを指定します.(次の例)
s1 = 'a:b:c'
s2 = 'AxxBxxCxxD'
print( s1.split(':') )
print( s2.split('xx') )
実行結果:
['a', 'b', 'c']
['A', 'B', 'C', 'D']
■ 文字列の分解 (2)
複数の行で構成されるテキストデータを行毎に分解するには splitlines メソッドを使います.(次の例)
s = '''あいうえお
かきくけこ
さしすせそ'''
s.splitlines()
実行結果:
['あいうえお', 'かきくけこ', 'さしすせそ']
■ join による連結
join メソッドを使うと,文字列のリストを連結して1つの文字列にすることができます.(次の例)
lst = ['a','b','c']
print( ':'.join(lst) )
print( ''.join( lst ) )
実行結果:
a:b:c
abc
これはコロン「:」を区切り文字とした場合と,空文字(クオートの内側に何もない文字列)を区切り文字とした場合の連結の例です.
文字列の置換
指定した文字列を別の文字列に置き換える(置換する)には replace メソッドを使用します.
対象文字列.replace( 文字列1, 文字列2 )
このようにすることで「対象文字列」に含まれる「文字列1」の部分を「文字列2」に置き換えたものを得ることができます.次の例は文字列 s の中の「def」という部分を「DEF」に置き換えるものです.
s = 'abcdefgabcdefgabcdefg'
s.replace('def','DEF')
実行結果:
'abcDEFgabcDEFgabcDEFg'
文字列に対する各種の検査
■ 含有検査
文字列の中にある文字列が含まれるかどうかを検査するには「in」を使います.
文字列1 in 文字列2
このようにすることで「文字列2」の中に「文字列1」があるかどうかを検査することができます.検査結果は True か False の真理値で得られます.(次の例)
s = '私は大阪府に住んでいます.'
print( '大阪府' in s )
print( '東京都' in s )
実行結果:
True
False
これは文字列 s に「大阪府」という文字列が含まれているか,「東京都」という文字列が含まれているかどうかを判定する例で,結果が真理値で得られていることがわかります.
実際のプログラミングの局面では,真理値を直接的に求めるよりも,if 文などの条件判定の中で暗に使うことの方が多いかもしれません.(次の例)
if '大阪府' in s:
print('大阪府を含んでいます.')
else:
print('大阪府を含んでいません.')
実行結果:
大阪府を含んでいます.
if による条件判定に関する詳しいことは別の記事で解説します.
■ 英字,数字の判定
文字列の内容が英字,数字であるかどうかを判定する次のようなメソッドがあります.
文字列.isalpha() →「文字列」が全てアルファベットかどうかの検査
文字列.isdecimal() →「文字列」が全て数字かどうかの検査
文字列.isalnum() →「文字列」が全てアルファベットもしくは数字かの検査
● isalpha の使用例
print( 'abc'.isalpha() )
print( 'aBc'.isalpha() )
print( 'm4a'.isalpha() )
実行結果:
True
True
False
● isdecimal の使用例
print( '123'.isdecimal() )
print( '640x480'.isdecimal() )
実行結果:
True
False
● isalnum の使用例
print( '123'.isalnum() )
print( '640x480'.isalnum() )
print( '123+456'.isalnum() )
実行結果:
True
True
False
英大文字,小文字の判定と変換
半角アルファベットの文字列が大文字,小文字であるかどうかを判定する次のようなメソッドがあります.
文字列.islower() →「文字列」が全て小文字かどうかの検査
文字列.isupper() →「文字列」が全て大文字かどうかの検査
● islower,isupper の使用例
s1 = 'this is a sample'
s2 = 'APPLE'
print( s1.islower() )
print( s1.isupper() )
print( s2.islower() )
print( s2.isupper() )
実行結果:
True
False
False
True
半角アルファベットの文字列を大文字,小文字に変換する次のようなメソッドがあります.
文字列.lower() →「文字列」を全て小文字に変換
文字列.upper() →「文字列」を全て大文字に変換
● upper,lower の使用例
print( s1.upper() )
print( s2.lower() )
実行結果:
THIS IS A SAMPLE
apple
文字コードの値に関すること
文字列を構成する文字はコンピュータ内部では数値(文字コード)で表現されています.ある文字の文字コードを求めるには ord 関数を,文字コードの値に対応する文字を求めるには chr 関数を使用します.(次の例)
print( ord('A') )
print( chr(66) )
実行結果:
65
B
Python3 の基礎 − 超入門・再入門 −
【このカテゴリーの最新記事】
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/10430631
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック