今回は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'
まとめ
・文字列にはバイト文字列とユニコード文字列がある
・変更不可能なオブジェクトのため、値の変更・除外はコピーして処理している
以上。