IT

Pythonの文字列処理

今回はpythonにおける文字列の処理に関する内容を紹介します。主な内容は文字列の作成・参照・加工・除外です。

Contents

特徴

pythonの文字列の特徴を以下に挙げます。

・文字列にはバイト文字列、row文字列、ユニコード文字列があります
・文字列は変更不可能なオブジェクトです。
・文字列の中から任意の文字列を簡単に抽出できます

文字列を新しくつくる

文字列にも文字コードによって作り方が様々です。それらを以下に紹介します。

バイト文字列を作る

バイト文字列を作るには『』や『』で文字列をくくります。どちらを使っても問題ありません。


>>> s1 = 'abc'
>>> s1
'abc'
>>> s2 = "abc"
>>> s2
'abc'

また、改行を含めた文字列を作成するには『“””』でくくります。


>>> s = """abc
... def
... ghi"""
>>> s
'abc\ndef\nghi'

『”””』でくくると改行も文字列に含まれるので注意が必要です。改行が不要な場合は『\』を行末に記述します。

その他に文字列は『”』で囲まれた文字列同士を並べるだけで連結することができます。


>>> 'This is'' a Pen'
'This is a Pen'

ただし、片方を変数とするとエラーとなるので注意してください。片方が変数の場合は『+』演算子で連結してください。
 

row文字列を作る(r’文字列’)

row文字列とはエスケープシーケンスを無視(特殊文字として解釈しない)した文字列です。『r’文字列’』で記述します。


>>> s = r'abc\ndef'
>>> s
'abc\\ndef'

 

ユニコードの文字列を作る(u’文字列’)

日本語などのユニコード文字列を扱うには『u’文字列’』を使います。


>>> s = u'あいうえお'
>>> s
u'\u3042\u3044\u3046\u3048\u304a'

日本語をユニコード文字列を使わずに記述すると以下のようになります。


>>> s = 'あいうえお'
>>> s
'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a'

 

スライスで文字列をつくる

今までも出てきたスライスですが、文字列にも適用できます、既存の文字列の中から範囲を指定し、その範囲内の文字をコピーして作成します。


>>> s1 = 'abcdefghijk'
>>> s2 =s1[1:9]
>>> s2
'bcdefghi'

文字列を参照する

ここでは文字列の中から任意の文字列を参照(抽出)する方法について紹介します。

インデックスで参照する文字列を指定する

文字列の中からインデックスを指定して文字列を参照するには『文字列[インデックス]』を使います。


>>> s = 'abcdefghijk'
>>> s[5]
'f'

もちろん、スライスを使って範囲指定(文字列[開始インデックス:終了インデックス])することも可能です。


>>> s[1:6]
'bcdef'

 

文字列を加工する

文字列は変更不可能なオブジェクトのため、更新することはできません。しかし、値をコピーして加工することによって、あたかも更新している可能ように見せかけています。ここでは、文字列の様々な加工方法について紹介します。

文字列を分割する(split関数とrsplit関数)

文字列を分割するには『‘文字列’.split(区切り文字,分割数)』もしくは『‘文字列’.rsplit(区切り文字,分割数)』を使います。指定した区切り文字で分割した値はリストで返します。分割数は、文字列内に複数の区切り文字があった場合、指定した分割数以降は分割をしません。また、分割数を省略しても問題ありません。


>>> s = 'a,b,c,d,e'
>>> s.split(',')
['a', 'b', 'c', 'd', 'e']

 

文字列を改行文字で分割する(’文字列’.splitlines())

文字列を改行単位で分割する場合は『‘文字列’.splitlines()』を使います。


>>> s = 'abc\ndef'
>>> s.splitlines()
['abc', 'def']

 

文字列を指定した文字で置き換える(‘文字列’.replace(‘置換対象文字’,’置換する文字’,置換回数))

これは、『‘文字列’.replace(‘置換対象文字’,’置換する文字’,置換回数)』を使います。置換回数は省略しても問題ないです。


>>> s = 'abcdrfg'
>>> s.replace('c','d')
'abddrfg'

文字列を変換ルールで置き換える

予め文字列の変換法則をルールとして用意し、変換する方法です。これはまず、変換法則のルールを作成します。作成は『string.maketrance(‘変換対象文字列’,’変換後文字列’)』を使います。その後、『‘文字列’.translate(ルール)』で変換します。


>>> import string
>>> rule = string.maketrans('abc','ABC')
>>> s = 'abcdrfg'
>>> s.translate(rule)
'ABCdrfg'

 

文字列を大文字・小文字に変換する

文字を大文字や小文字に変換する方法を紹介します。

文字列を大文字に変換する(‘文字列’.upper())

文字列を大文字に変換するには、『‘文字列’.upper()』を使います。


>>> s = 'abcdefg'
>>> s.upper()
'ABCDEFG'

 

文字列を小文字に変換する(‘文字列’.lower())

文字列を小文字に変換するには、『‘文字列’.lower()』を使います。


>>> s = 'ABCDSFG'
>>> s.lower()
'abcdsfg'

 

文字列の先頭を大文字に変換する(‘文字列’.capitalize())

文字の先頭を大文字に変換するには、『‘文字列’.capitalize()』を使います。


>>> s = 'abcdefg'
>>> s.capitalize()
'Abcdefg'

 

文字列の単語の先頭文字を大文字に変換する(‘文字列’.title())

文字列の単語単位で先頭を大文字に変換するには、『‘文字列’.title()』を使います。


>>> s = 'abc def'
>>> s.title()
'Abc Def'

 

指定した文字を文字列から取り除く

文字列から特定の文字を取り除くには、両端の文字を取り除く『‘文字列’.strip(取り除く文字)』や左端の文字を取り除く『‘文字列’.lstrip(取り除く文字)』、右端の文字を取り除く『‘文字列’.rstrip(取り除く文字)』があります。


>>> s = 'abcdefga'
>>> s.strip('a')
'bcdefg'
>>> s.lstrip('a')
'bcdefga'
>>> s.rstrip('a')
'abcdefg'

 

文字列の種類を確認する

文字列の種類(英数文字や数字など)を確認する方法を紹介します。

文字列が英数文字のみかどうかを確認する

英数文字と英文字のみの2種類の確認方法について説明します。どちらも「!」などの記号が含まれていると『False」となります。

英文字または数字のみか確認をする(‘文字列’.isalnum())

これは『‘文字列’.isalnum()』を使います。


>>> s = 'abc123'
>>> s.isalnum()
True

 

英文字のみか確認をする(‘文字列’.isalpha())

これは『‘文字列’.isalpha()』を使います。


>>> s = 'abc123'
>>> s.isalpha()
False

 

文字列が数字のみかを確認する(‘文字列’.isdigit())

これには『‘文字列’.isdigit()』を使います。


>>> s = '123456789'
>>> s.isdigit()
True

 

文字列のサイズの大小を確認する

ここでは文字列が「全て大文字か」、「全て小文字か」、「先頭だけ大文字か」を確認する方法について紹介します。

文字列の文字が全て大文字かを確認する(‘文字列’.isupper())

文字列の文字が全て大文字かを確認するのには『‘文字列’.isupper()』を使います。


>>> s = 'ABCDEFG'
>>> s.isupper()
True

 

 文字列の文字が全て小文字かを確認する(‘文字列’.islower())

文字列の文字が全て小文字かを確認するには『‘文字列’.islower()』を使います。


>>> s = 'abcdefg'
>>> s.islower()
True

 

文字列の先頭が大文字になっているかを確認する(‘文字列’.istitle())

文字列の先頭文字が大文字かどうかを確認するには『‘文字列’.istitle()』を使います。


>>> s = 'Abcdefg'
>>> s.istitle()
True

 

文字列が空白・タブ・改行のみかどうかを確認する(‘文字列’.isspace())

これは『‘文字列’.isspace()』を使います。空白・タブ・改行のみで作成された文字列の場合のみ「True」を返します。空文字は確認対象ではありません。


>>> s ='\t \n'
>>> s.isspace()
True

 

よく使うもの

その他よく使うものをまとめました。

フォーマット文字列(‘文字列’.format(変数))

今まで何回か出てきた文字列です。これは、変数の値を文字列の中に埋め込むものです。『文字列.format(変数)』を使います。文字列内では変数の受け皿として{0}を使います。数字は括弧内の変数の順序に従います。これは非常に使います。


>>> s = 'My name is {0}.I am {1} age.'.format('Jhon','18')
>>> s
'My name is Jhon.I am 18 age.'

 

文字列の結合(‘間に挟む文字列’.join([‘文字列1′,’文字列2’,・・・]))

文字列の結合は『+』演算子を使っても可能ですが、メモリの効率と処理速度から『‘間に挟む文字列’.join([‘文字列1′,’文字列2’,・・・])』を使った方がよいです。joinの引数はリストを指定します。なお、数値などの文字列以外を指定するとエラーが発生します。


>>> s = '&'.join(['M','A'])
>>> s
'M&A'

 

指定した文字列を検索する(検索したい文字列 in 文字列)

文字列の中に指定した文字列があるかを調べるには『検索したい文字列 in 文字列』を使います。結果は「True」か「False」で返ってきます。


>>> s = 'abcdefghijk'
>>> 'efg' in s
True

 

指定した文字列のインデックスを調べる

指定した文字列のインデックスをしらべる関数について4つ紹介します。

find関数とindex関数

これは『‘検索対象文字列’.find(検索文字,開始位置,終了位置)』を使います。検索にヒットしなかった場合は、「-1」を返します


>>> s = 'abcdrfghijk'
>>> s.find('c',0,10)
2

どうような関数として『‘検索対象文字列’.index(検索文字,開始位置,終了位置)』があります。これは検索にヒットしなかった場合は「ValueError」が発生します。

rfind関数とrindex関数

これは文字列を右から検索し、『‘検索対象文字列’.rfind(検索文字,開始位置,終了位置)』を使います。検索にヒットしなかった場合は、「-1」を返します


>>> s = 'abcdrfghijk'
>>> s.rfind('c',0,10)
2

どうような関数として『‘検索対象文字列’.rindex(検索文字,開始位置,終了位置)』があります。これは検索にヒットしなかった場合は「ValueError」が発生します。

文字の出現回数をしらべる(‘文字列’.count(検索文字,開始位置,終了位置))

文字列の中に指定した文字が何回含まれているかを調べるには、『‘文字列’.count(検索文字,開始位置,終了位置)』を使います。


>>> s = 'abcdrfghijk'
>>> s.count('c')
1

 

開始文字と終了文字を調べる

pythonにも開始文字と終了文字を調べる方法があります。VBなどのstratswithと同じです。

開始文字を調べる(‘文字列’.stratswith(‘検索文字’,開始位置,終了位置))

開始文字を調べるには、『‘文字列’.stratswith(‘検索文字’,開始位置,終了位置)』を使います。戻り値は「True」か「False」です。


>>> s = 'abcdrfghijk'
>>> s.startswith('a')
True

 

終了文字を調べる(‘文字列’.endswith(‘検索文字’,開始位置,終了位置))

終了文字を調べるには、『‘文字列’.endswith(‘検索文字’,開始位置,終了位置)』を使います。戻り値は「True」か「False」です。


>>> s = 'abcdrfghijk'
>>> s.endswith('k')
True

 

文字列の寄せ

文字列を左に寄せるには、『‘文字列’.ljust(文字数)』を使い、中央に寄せるには『‘文字列’.center(文字数)』、右に寄せるには『‘文字列’.rjust(文字数)』を使います。


>>> s ='abc'
>>> s.ljust(10)
'abc       '
>>> s.center(10)
'   abc    '
>>> s.rjust(10)
'       abc'

 

文字列を0詰めする(‘文字列’.zfill(文字数))

文字列を0詰めするには、『‘文字列’.zfill(文字数)』を使います。


>>> s = '123'
>>> s.zfill(10)
'0000000123'

 

まとめ

文字処理のきほん

・文字列にはバイト文字列とユニコード文字列がある
・変更不可能なオブジェクトのため、値の変更・除外はコピーして処理している

 

以上。