pythonのsplit関数は、数字やアルファベット、記号などの文字列から指定した規則に従って分割を行いリスト化(配列化)してくれます。
業務改善の為に、エクセルのvbaで様々な条件で文字列を区切るプログラムを組んだ時には、苦労した記憶がありますが、
split関数は多くてもわずか数行の記述で簡単にできます。
split関数について
ここでは、基本的なsplit関数の使い方から
- rsplit()
- splitlines()
- re.split()
といった実際の現場で役立つ応用まで解説します。
特に正規表現にマッチした部分で分割するre.splitは、スクレイピング では必須となりますので、ぜひ覚えましょう!
(→Python:webスクレピングの基本はこちら)
基本的なsplit関数の使い方
splitの記述方法
str.split(区切り文字,maxsplit=1)
splitメソッドはstring(文字列)型のメソッドです。
区切り文字の部分には、文字列を分割する文字を指定します。未指定の場合は、空白文字で区切ります。
maxsplitは何回区切るかの指定ができます。省略可で未指定の場合は、全ての区切り文字で区切ります。
文字列の分割:任意の文字列で区切る
splitメソッドは文字列を、指定した任意の文字で区切る時に使用します。
みんな大好きうまい棒の味別に区切ってみましょう。
(replで実行します。replの使い方(for python )はこちら)
>>> umaibo = 'chees and mentai'
>>> umaibo_taste = umaibo.split(‘and’)
変数umaiboでは、各うまい棒の味を「and」で結んでいます。
それぞれの味で区切る為、「and」を指定文字にして区切ります。
>>> print(umaibo_taste)
['chees ', ' mentai']
実行結果を見る為に「umaibo_taste」を出力すると
「chees」と「mentai」に区切られリスト化してくれます。
splitで区切り文字として指定した「and」は消えてしまいます。
この点は注意が必要です。
例えば、「standup and go」という文字列をstandupとgoで区切ろうと思って「and」でsplitした場合
>>> str = 'standup and go'
>>> str2 = str.split('and')
>>> print(str2)
['st', 'up ', ' go']
「stand」にある「and」は区切り文字のため実行結果が予期しない結果となってます。
引数に値を指定しない場合
引数に値を指定しない場合は「空白文字」で区切ります。
>>> umaibo = 'chees mentai takoyaki'
>>> umaibo_taste = umaibo.split()
>>> print(umaibo_taste)
['chees', 'mentai', 'takoyaki']
分割回数を指定
splitの記述方法にも記載しましたが、splitは分割回数の指定が可能です。
>>> umaibo = 'chees,mentai,takoyaki,nattou’
>>> umaibo_taste = umaibo.split(',',maxsplit=2)
>>> print(umaibo_taste)
[‘chees', 'mentai', 'takoyaki,nattou’]
「maxsplit=」は省略可です。
>>> umaibo = 'chees,mentai,takoyaki,nattou’
>>> umaibo_taste = umaibo.split(',',2)
>>> print(umaibo_taste)
[chees', 'mentai', 'takoyaki,nattou’]
区切り文字を指定せずに分割回数だけ指定したい場合は「区切り文字」に必ず「None」を記述してください。
>>> umaibo = 'chees mentai takoyaki nattou’
>>> umaibo_taste = umaibo.split(None,2)
>>> print(umaibo_taste)
[chees', 'mentai', 'takoyaki nattou’]
「None」を記述しないとエラーとなりpython先生から怒られます。
注意点:int型ではエラーになります。
当然、文字列型では無いint型で区切りを行うとエラーになります。
>>> num = 32245
>>> num2 = num.split('4')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'split'
「splitはint型の属性じゃねーわ!」とpython先生から怒られます。
どうしてもint型の数値を区切りたい時は、一旦str型に変換してから行いましょう。
>>> num = 32245
>>> num2 = str(num)
>>> num3 = num2.split('4')
>>> print(num3)
['322', '5']
応用編
rsplitやsplitlines、re.splitの使用方法も解説します。
rspilit
rsplitの 「r」 は文字列の右側からというright、もしくは後ろという意味のrearから来ていると思われます。
splitの場合は、区切る順序は文字列の最初(左)からでしたが、rsplitは区切る順序が文字列の最後(右)からとなります。
(rspilitはムーディー勝山さんと覚えましょう。)
実際の使用例
>>> umaibo = 'chees,mentai,takoyaki,nattou’
>>> umaibo_taste = umaibo.rsplit(',',2)
>>> print(umaibo_taste)
[‘chees, mentai', 'takoyaki’,’nattou’]
右から順に、区切るため‘chees, mentai’は区切られいません。
splitlines
改行を専門に分割するのが、splitlinesです。
split()やrsplit()ではデフォルトで「改行を含む空白文字で分割」しますが、
分割を改行だけ実行したい場合は、splitlinesを使います。
splitlinesの記述方法は
str.splitlines()
です。
実際の使用例
>>> umaibo = 'chees\nmentai\ntakoyaki\nnattou'
>>> umaibo_taste = umaibo.splitlines()
>>> print(umaibo_taste)
['chees', 'mentai', 'takoyaki', 'nattou']
改行コード「\n」で分割されています。
ちなみにunix系OSとwin系OSとでは改行コードが違いますが、混在していても問題なく分割されます。
参考:Python:splitlinesは文字列を改行で分割します
re.split
re.splitは正規表現パターンで文字列を分割できます。
ちなみにre.splitの「re」は英語で正規表現の意味である「Regular Expression(Regex)」のreです。
冒頭でも言いましたが、pythonのスクレピングでよく使うのが「re.split」です。
スクレピングを学習されている方は是非覚えてください。
re.splitの使用例
>>> umaibo = 'chees1547236mentai365486takoyaki51324nattou'
上手い棒の味毎に区切りたいのに、に不規則な数字が記述されてどうやって区切ってよいか悩みますよね?
これを一発で解決するのが「re.split」です。
>>> umaibo_taste = re.split('\d+', umaibo)
>>> print(umaibo_taste)
>>> ['chees', 'mentai', 'takoyaki', 'nattou']
区切り文字で指定した「\d+」は、「\d」で0~9の数字のどれかを表し、これに「+」を付け足して「\d+」とすると1文字以上の連続した数字を表すことが出来ます。
これにより、任意の連続した数字であっても区切る事が出来たのです。
スクレイピングでの「re.split」は、メールアドレスを取得する時とか、「郵便番号」を取得する時等に活躍します。
「re.split」の使い方についての詳しい解説は、近日公開しますのでお待ちください。