13.文字列

pythonのデータ型の中でも文字列型は一番よく使うデータ型です。

なので、文字列型の取り扱い方を詳しく見ていきましょう。

文字列型について

文字列型にする場合は
シングルクォートやダブルクォートで囲みます。
変数に格納する際も同様です。

In [1]:
st = 'abcde'
print(st)
print(type(st))
abcde
<class 'str'>

シングルクォートやダブルクォートの使い分け

"..." の中では ' を、'...' の中では " を使うことができます。
"..." の中で " を、'...' の中で ' を使用するには、
\ バックスラッシュを用いて引用符をエスケープ(無効化)します。

In [2]:
# \ バックスラッシュを用いるとその後に続く引用符が無効になり、表示させることができる。
st = "We can use \" in the string."
print(st)

st = 'We can use \' in the string.'
print(st)
We can use " in the string.
We can use ' in the string.

特殊な文字列を打ち込む場合には、このエスケープ文字を使用する。

macは \ バックスラッシュ 
windowsは ¥ マーク

\n とすると改行コード、\tと打ち込むとタブを表現できる。

In [3]:
# 改行コード
print('aaaa \n bbbb')

# タブ
print('cccc \t dddd')
aaaa 
 bbbb
cccc 	 dddd

改行はエンターキーだが、打ち込むことはできないので
改行を含ませたい場合はエスケープ文字を使って表現できる。

このようにエスケープ文字を使って表現する特定の文字のことを
エスケープシーケンスと言います。

他にもいくつかエスケープシーケンスがありますが、
余り使わないかもしれません。

三重クォート """...""" や '''...''' は、
複数行にまたがった文字列を記述することができます。

三重クォートはしばしば、複数行のコメントとして利用されることがあります。

In [4]:
mail_text = '''
林様

お世話になっております。木森です

本日はウェルカムトゥーザジャングルをお届けいたします。
'''
print(mail_text)
林様

お世話になっております。木森です

本日はウェルカムトゥーザジャングルをお届けいたします。

メールの差し込み文章を作るときなどによく使われる手法です。
文章をあらかじめ変数に用意しておいて
その一部を取り替えると、いろいろな人向けの本文が作成できます。

文字列関数について

Pythonでは文字列を操作するいろいろな関数が備わっています。

その中からよく使うものをご紹介します。

replace:文字列を置換する

置換対象文字列.replace('置換前文字列','置換後文字列')

In [5]:
aaa = 'abcdefg'
print(aaa)
# replaceでdef を zzzz に変換
print(aaa.replace('def','zzzz'))
abcdefg
abczzzzg

in , startswith , endswith:対象の文字列に対して検索文字列を含むかどうかの判定をする

検索文字列 in 対象の文字列 :文字列を含むかどうかの判定する

対象の文字列.startswith(検索文字列): 始まりの文字列かどうかを判定する

対象の文字列.endswith(検索文字列) : 終端の文字列かどうかを判定する

In [6]:
apple = 'apple'
# apple に pp が含まれるかどうかを判定する
print('pp' in apple)

# apple がapp で始まるかどうかを判定する
print(apple.startswith('app'))

# apple が le で終わるかどうかを判定する
print(apple.endswith('le'))
True
True
True

split , rsplit , splitlines : 文字列をリストに変換

文字列.split(区切り文字) : 指定したセパレーターをもとに文字列を区切り, リストを返す

文字列.rsplit(区切り文字 , 区切り個数) : 区切りはじめる方向がsplit()と逆から引数指定分までを返す

文字列.splitlines() : 改行ごとに文字列を区切り, リストを返す

リスト型については詳細は次項で説明する。

In [7]:
# , 区切りでリスト型にする
print('aaaa,bbb,ccc'.split(','))

# 区切りはじめる方向がsplit()と逆から引数指定分までを返す
print('aaaa,bbb,ccc'.rsplit(',',1)) 

# 改行ごとに文字列を区切り, リストを返す
print('aaaa\nbb\ncc'.splitlines())
['aaaa', 'bbb', 'ccc']
['aaaa,bbb', 'ccc']
['aaaa', 'bb', 'cc']

join() : かっこの中のリスト型の文字列を連結する

'区切り文字'.join([文字,文字])

In [8]:
aaa = ','.join(['a','b','c'])
print(aaa)
a,b,c

count() : 文字の個数をカウントする

検索対象文字列.count(カウントしたい文字列)

見つからない場合は0を返します。

In [9]:
aaa = '平平平平'.count('平')
print(aaa)

aaa = '平平平平'.count('米')
print(aaa)
4
0

ここから下は使う頻度は少ないものですが文字列関数として備わっているものです。

find , rfind , index , rindex : 文字列の位置の判定

対象の文字列.find(検索文字列) :検索文字列を探し, あった場合は, 最小のインデックスを返す. なければ-1を返す

対象の文字列.rfind(検索文字列)) :検索文字列を探し, あった場合は, 最大のインデックスを返す. なければ-1を返す

対象の文字列.index(検索文字列) :検索文字列を探し, あった場合は, 最小のインデックスを返す. なければエラーを返す

対象の文字列.rindex(検索文字列) :検索文字列を探し, あった場合は, 最大のインデックスを返す. なければエラーを返す

In [10]:
# appleから p を探し, あった場合は, 最小のインデックスを返す. なければ-1を返す
print('apple'.find('p'))  

# appleから p を探し, あった場合は, 最大のインデックスを返す. なければ-1を返す
print('apple'.rfind('p')) 

# pen pine apple pen から e を探し, あった場合は, 最小のインデックスを返す. なければエラーを返す
print('pen pine apple pen'.index('e'))  

# pen pine apple pen からe を探し, あった場合は, 最大のインデックスを返す. なければエラーを返す
print('pen pine apple pen'.rindex('e')) 
1
2
1
16

isalnum , isalpha , isdigit , islower , isspace , istitle : 文字列の構成要素の判定

文字列.isalnum() : 文字がすべて英数文字かどうかの判定

文字列.isalpha() : 文字がすべて英字かどうかの判定

文字列.isdigit() : 文字がすべて数字かどうかの判定

文字列.islower() : 大小文字の区別がある文字がすべて小文字かどうかの判定

文字列.isspace() : 文字がすべて空白かどうかの判定

文字列.istitle() : 文字列がタイトルケース(先頭が大文字)かどうかの判定

In [11]:
# 文字列が英数字だけかどうかを判定する
print('az189898ssss'.encode('utf-8').isalnum()) 

# 文字列が全て英字だけかを判定する
print('aaaaAAAZZZzz'.encode('utf-8').isalpha()) 

# 文字列が数字だけかを判定する
print('123112399876'.encode('utf-8').isdigit()) 

# 小文字だけかどうかを判定する
print('abcdefghijkl'.encode('utf-8').islower()) 

# 文字が空白かどうかを判定する
print('            '.encode('utf-8').isspace()) 

# 文字列がタイトルケース(先頭が大文字)かどうかの判定
print('Apple Zedd  '.encode('utf-8').istitle()) 
True
True
True
True
True
True

capitalize , swapcase , title , lower , upper : 大文字, 小文字の変換

文字列.capitalize() : 最初の文字のみを大文字にする

文字列.swapcase() : 大文字を小文字に, 小文字を大文字に変換する

文字列.title() : 文字列をタイトルケース(先頭が大文字)にする

文字列.lower() : 文字をすべて小文字に変換する

文字列.upper() : 文字をすべて大文字に変換する

In [12]:
# 最初の文字のみを大文字にする
print('az189898ssss'.capitalize()) 

# 大文字を小文字に, 小文字を大文字に変換する
print('az189898SSSS'.swapcase())   

# 文字列をタイトルケース(先頭が大文字)にする
print('az189898ssss'.title())      

# 文字をすべて小文字に変換する
print('Za189898SsSs'.lower())      

# 文字をすべて大文字に変換する
print('az189898ssss'.upper()) 
Az189898ssss
AZ189898ssss
Az189898Ssss
za189898ssss
AZ189898SSSS