9
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Python】複数条件で文字列を分割しリストを生成【re.split】

Last updated at Posted at 2021-05-24

Pythonで文字列をリストに変換したい場合,まず思い浮かぶのはsplit()を使う方法です.

s = 'AAA BBB CCC'
l = s.split()
l
['AAA', 'BBB', 'CCC']

分割できました.

以上の例は文字列が空白で区切られている場合ですが,他にも...

s1 = 'AAA,BBB,CCC'
l1 = s1.split(',')
l1
['AAA', 'BBB', 'CCC']
s2 = 'AAA/BBB/CCC'
l2 = s2.split('/')
l2
['AAA', 'BBB', 'CCC']

このように,()内で区切り文字を指定することで分割できます.

re.split()

文字列からリストに変換する他の手段としてre.split()を使う方法があります.

import re

s = 'AAA BBB CCC'
l = re.split(' ', s)
l
['AAA', 'BBB', 'CCC']

このようにre.split('区切り文字', 文字列)とすることで,先程と同様にリスト化できます.

でもこれだとsplit()で十分な気がしますよね.

しかし,re.split()の真価が発揮されるのはここからです.

複数条件で文字列を分割

re.split()を用いることで複数条件で文字列を分割することが出来ます.

例えば...

s = 'AAA/BBB_CCC'
l = re.split('[/_]', s)
l
['AAA', 'BBB', 'CCC']

このように,[]の中に/_の複数の区切り文字を入れることで,それらに該当する全ての箇所で分割してくれます.

便利ですね.

ちなみに少し細かいことを話すと,これには正規表現と呼ばれるものが使われており,正規表現において[...]は,角括弧の中身のいずれか1文字に該当する文字を表します.

なので,以上のような処理が出来るわけですね.

区切り文字が連続する場合

区切り文字が連続する場合,普通に記述するとリストがおかしくなります.

s = 'AAA - BBB - CCC'
l = re.split('[ -]', s)
l
['AAA', '', '', 'BBB', '', '', 'CCC']

sにはハイフン-と空白 が含まれているためこの二つを区切り文字としましたが,lには空要素''が含まれてしまっています.

これは区切り文字が-のように連続していることが原因のようです.

これを解決するためには...

s = 'AAA - BBB - CCC'
l = re.split('[ -]+', s)
l
['AAA', 'BBB', 'CCC']

このように区切り文字を[...]+とします.

この+は正規表現において,該当の文字を一回以上繰り返すことを示します.

今回は[ -]の後についているため, -を一回ずつ選択しながら一回以上繰り返す文字列に該当するわけですね.

なので,-のような文字列にも対応できます.

ちなみに私はこれが解決せずに半日ほど悩みました...

複数の文字列を条件として区切る

ここまでは,/-等の記号を用いた分割方法を紹介しました.

ですが,いくつかの文字列を用いて分割したい場合もあるかもしれません.

例えば,andafterという二つの条件で区切りたい場合は以下のようにします.

s = 'DOGandCATafterFISH'
l = re.split('and|after', s)
l
['DOG', 'CAT', 'FISH']

このようにパイプ|を使うことで,複数の文字列条件を扱えます.

ちなみに|はいわゆるORを表しますね.

今回は以上になります.

少しでもお役に立てれば幸いです!!

おまけ

複数の文字列と記号を区切り文字としたい場合.

s = 'dog and cat after fish'
l = re.split('and|after| ', s)
l
['dog', '', '', 'cat', '', '', 'fish']

ですよねーーー

解決策としては...

l = re.split(' and | after ', s)
l
['dog', 'cat', 'fish']

柔軟性はなくなりますが,文字列のルールが明確であればこれでも良いかと思います.

他には少し面倒ですが...

l = re.split('and|after', s)
print(l)
s2 = ''.join(l)
print(s2)
l2 = s2.split()
l2
['dog ', ' cat ', ' fish']
dog  cat  fish
['dog', 'cat', 'fish']

一度文字列条件だけでリスト化したものをjoin()で文字列化し,その後空白条件で再度リスト化しています.

もし,他に簡単な方法があれば是非教えてください!!

9
11
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?