【Python】手を動かしながら正規表現を学ぶ | データサイエンス100本ノック【問13〜問15 回答】

【Python】手を動かしながら正規表現を学ぶ | データサイエンス100本ノック【問13〜問15 回答】

当ページのリンクには広告が含まれています。







目次

この記事の対象者


・ 正規表現を手を動かしながら学びたい人

・ データサイエンティストを目指している人

正規表現とはなにか



正規表現とは、様々なパターンで並んでいる文字列を特殊文字などを使って表現する表記法です。

正規表現は、大量のデータから特定の条件に合致したデータを抽出する際に使用されます。

基本的な表記法としては以下のものがあります。

  • 任意の1文字:.
  • 文字列の先頭:^
  • 文字列の最後:$
  • 同一文字の繰り返し:*, +, ?
  • 範囲指定:-
  • 角括弧に含まれるいずれか1文字にマッチ:[ ]
  • 角括弧に含まれる文字以外にマッチ:[^]

その他の表記法は以下のリファレンスを参照いただければと思います。

re —- 正規表現操作 — Python 3.9.4 ドキュメント


実際に手を動かして正規表現を使ってみよう

早速問題を解いてみよう!



正規表現の主な表記法はなんとなく分かったかと思いますが、実際に使おうと思うと、なかなか使いこなすのは難しいものです。

そこで、一般社団法人データサイエンティスト協会がGitHubに公開している「データサイエンス100本ノック」の環境を使って、正規表現の具体的な使い方を学んでいきましょう。

データサイエンス100本ノックは、自身のPCにDockerを用いて環境構築することが出来ます。

データサイエンス100本ノックの環境構築方法は以下の記事にまとめています。





以降にデータサイエンス100本ノックの中で、正規表現に関連する問題をピックアップしてますので、実際に手を動かしながら正規表現の使い方を学んでいきましょう。

13問目:前方一致

P-013: 顧客データフレーム(df_customer)から、ステータスコード(status_cd)の先頭がアルファベットのA〜Fで始まるデータを全項目抽出し、10件だけ表示せよ。

この問題を解くためには正規表現を使う必要があります。

文字列の先頭を表す^と、文字列の範囲を指定する-と、文字列のマッチ条件を指定する[]を用いて^[A-F]のように記述すればOKです。

問13回答
1
df_customer.query("status_cd.str.contains('^[A-F]', regex=True)", engine='python').head(10)
出力
1
2
3
4
5
6
7
8
9
10
11
	customer_id	customer_name	gender_cd	gender	birth_day	age	postal_cd	address	application_store_cd	application_date	status_cd
2 CS031415000172 宇多田 貴美子 1 女性 1976-10-04 42 151-0053 東京都渋谷区代々木********** S13031 20150529 D-20100325-C
6 CS015414000103 奥野 陽子 1 女性 1977-08-09 41 136-0073 東京都江東区北砂********** S13015 20150722 B-20100609-B
12 CS011215000048 芦田 沙耶 1 女性 1992-02-01 27 223-0062 神奈川県横浜市港北区日吉本町********** S14011 20150228 C-20100421-9
15 CS029415000023 梅田 里穂 1 女性 1976-01-17 43 279-0043 千葉県浦安市富士見********** S12029 20150610 D-20100918-E
21 CS035415000029 寺沢 真希 9 不明 1977-09-27 41 158-0096 東京都世田谷区玉川台********** S13035 20141220 F-20101029-F
32 CS031415000106 宇野 由美子 1 女性 1970-02-26 49 151-0053 東京都渋谷区代々木********** S13031 20150201 F-20100511-E
33 CS029215000025 石倉 美帆 1 女性 1993-09-28 25 279-0022 千葉県浦安市今川********** S12029 20150708 B-20100820-C
40 CS033605000005 猪股 雄太 0 男性 1955-12-05 63 246-0031 神奈川県横浜市瀬谷区瀬谷********** S14033 20150425 F-20100917-E
44 CS033415000229 板垣 菜々美 1 女性 1977-11-07 41 246-0021 神奈川県横浜市瀬谷区二ツ橋町********** S14033 20150712 F-20100326-E
53 CS008415000145 黒谷 麻緒 1 女性 1977-06-27 41 157-0067 東京都世田谷区喜多見********** S13008 20150829 F-20100622-F

では、postal_cdの先頭が150〜159で始まるデータを全項目抽出し、10件だけ表示させたい場合は、どうするでしょうか。

その場合は、[1][5][0-9]と記述します。

1
df_customer.query("postal_cd.str.contains('^[1][5][0-9]', regex=True)", engine='python').head(10)
出力
1
2
3
4
5
6
7
8
9
10
11
	customer_id	customer_name	gender_cd	gender	birth_day	age	postal_cd	address	application_store_cd	application_date	status_cd
2 CS031415000172 宇多田 貴美子 1 女性 1976-10-04 42 151-0053 東京都渋谷区代々木********** S13031 20150529 D-20100325-C
11 CS035614000014 板倉 菜々美 1 女性 1954-07-16 64 154-0015 東京都世田谷区桜新町********** S13035 20150804 0-00000000-0
13 CS009413000079 市川 コウ 1 女性 1975-12-28 43 158-0093 東京都世田谷区上野毛********** S13009 20151209 0-00000000-0
16 CS009315000023 皆川 文世 1 女性 1980-04-15 38 154-0012 東京都世田谷区駒沢********** S13009 20150319 5-20080322-1
21 CS035415000029 寺沢 真希 9 不明 1977-09-27 41 158-0096 東京都世田谷区玉川台********** S13035 20141220 F-20101029-F
24 CS035513000134 市川 美帆 1 女性 1960-03-27 59 156-0053 東京都世田谷区桜********** S13035 20150227 8-20100711-9
32 CS031415000106 宇野 由美子 1 女性 1970-02-26 49 151-0053 東京都渋谷区代々木********** S13031 20150201 F-20100511-E
41 CS008615000055 二宮 コウ 1 女性 1953-06-15 65 157-0074 東京都世田谷区大蔵********** S13008 20150623 5-20100531-8
53 CS008415000145 黒谷 麻緒 1 女性 1977-06-27 41 157-0067 東京都世田谷区喜多見********** S13008 20150829 F-20100622-F
54 CS008413000302 池谷 由樹 1 女性 1969-09-27 49 157-0067 東京都世田谷区喜多見********** S13008 20180813 0-00000000-0

14問目:後方一致

P-014: 顧客データフレーム(df_customer)から、ステータスコード(status_cd)の末尾が数字の1〜9で終わるデータを全項目抽出し、10件だけ表示せよ。

こちらの問題でも、正規表現を使用します。

今回は、末尾の数字の範囲を指定します。

文字列の最後の範囲指定は[]$という書き方になります。

今回は1〜9の範囲なので[1-9]$ということになります。

問14回答
1
df_customer.query("status_cd.str.contains('[1-9]$', regex=True)", engine='python').head(10)
出力
1
2
3
4
5
6
7
8
9
10
11
12

customer_id customer_name gender_cd gender birth_day age postal_cd address application_store_cd application_date status_cd
4 CS001215000145 田崎 美紀 1 女性 1995-03-29 24 144-0055 東京都大田区仲六郷********** S13001 20170605 6-20090929-2
9 CS033513000180 安斎 遥 1 女性 1962-07-11 56 241-0823 神奈川県横浜市旭区善部町********** S14033 20150728 6-20080506-5
12 CS011215000048 芦田 沙耶 1 女性 1992-02-01 27 223-0062 神奈川県横浜市港北区日吉本町********** S14011 20150228 C-20100421-9
14 CS040412000191 川井 郁恵 1 女性 1977-01-05 42 226-0021 神奈川県横浜市緑区北八朔町********** S14040 20151101 1-20091025-4
16 CS009315000023 皆川 文世 1 女性 1980-04-15 38 154-0012 東京都世田谷区駒沢********** S13009 20150319 5-20080322-1
22 CS015315000033 福士 璃奈子 1 女性 1983-03-17 36 135-0043 東京都江東区塩浜********** S13015 20141024 4-20080219-3
23 CS023513000066 神戸 そら 1 女性 1961-12-17 57 210-0005 神奈川県川崎市川崎区東田町********** S14023 20150915 5-20100524-9
24 CS035513000134 市川 美帆 1 女性 1960-03-27 59 156-0053 東京都世田谷区桜********** S13035 20150227 8-20100711-9
27 CS001515000263 高松 夏空 1 女性 1962-11-09 56 144-0051 東京都大田区西蒲田********** S13001 20160812 1-20100804-1
28 CS040314000027 鶴田 きみまろ 9 不明 1986-03-26 33 226-0027 神奈川県横浜市緑区長津田********** S14040 20150122 2-20080426-4

15問目:複数条件

P-015: 顧客データフレーム(df_customer)から、ステータスコード(status_cd)の先頭がアルファベットのA〜Fで始まり、末尾が数字の1〜9で終わるデータを全項目抽出し、10件だけ表示せよ。

この問題は、ここまで解いてきた13問目と14問目の条件を同時に満たすような正規表現を書かなければいけません。

  • 13問目の正規表現は、^[A-F]

  • 14問目の正規表現は、[1-9]$

この2つの条件をつなげるには、.*を用いればOKです。

.は任意の1文字をマッチさせ、*は直前のパターンを0回以上繰り返しを意味します。

^[A-F].*[1-9]$とすることで、先頭がアルファベットのA〜Fで始まり、末尾が数字の1〜9で終わるデータを抽出することができます。

問15回答
1
df_customer.query("status_cd.str.contains('^[A-F].*[1-9]$', regex=True)", engine='python').head(10)
出力
1
2
3
4
5
6
7
8
9
10
11
12

customer_id customer_name gender_cd gender birth_day age postal_cd address application_store_cd application_date status_cd
12 CS011215000048 芦田 沙耶 1 女性 1992-02-01 27 223-0062 神奈川県横浜市港北区日吉本町********** S14011 20150228 C-20100421-9
68 CS022513000105 島村 貴美子 1 女性 1962-03-12 57 249-0002 神奈川県逗子市山の根********** S14022 20150320 A-20091115-7
71 CS001515000096 水野 陽子 9 不明 1960-11-29 58 144-0053 東京都大田区蒲田本町********** S13001 20150614 A-20100724-7
122 CS013615000053 西脇 季衣 1 女性 1953-10-18 65 261-0026 千葉県千葉市美浜区幕張西********** S12013 20150128 B-20100329-6
144 CS020412000161 小宮 薫 1 女性 1974-05-21 44 174-0042 東京都板橋区東坂下********** S13020 20150822 B-20081021-3
178 CS001215000097 竹中 あさみ 1 女性 1990-07-25 28 146-0095 東京都大田区多摩川********** S13001 20170315 A-20100211-2
252 CS035212000007 内村 恵梨香 1 女性 1990-12-04 28 152-0023 東京都目黒区八雲********** S13035 20151013 B-20101018-6
259 CS002515000386 野田 コウ 1 女性 1963-05-30 55 185-0013 東京都国分寺市西恋ケ窪********** S13002 20160410 C-20100127-8
293 CS001615000372 稲垣 寿々花 1 女性 1956-10-29 62 144-0035 東京都大田区南蒲田********** S13001 20170403 A-20100104-1
297 CS032512000121 松井 知世 1 女性 1962-09-04 56 210-0011 神奈川県川崎市川崎区富士見********** S13032 20150727 A-20100103-5

まとめ: 手を動かしながら正規表現を学びました

本記事では【Python】手を動かしながら正規表現を学ぶ | データサイエンス100本ノック【問13〜問15 回答】というテーマでまとめました。

今回は正規表現の使い方の代表例をデータサイエンス100本ノックの問題を題材にして紹介しました。

データサイエンス100本ノックは、その他にも多くのPythonの使い方を学べる良教材です。

無料なので、本ブログの内容を参考に、チャレンジしてみてください。

>> 続きはこちらから

コメント