概要
re.matchを使用して実際に演習してみたことをまとめる。
演習
正規表現①
以下に駅弁の情報を利用して条件分岐を行う方法をまとめる。
駅弁の情報は「弁当屋、商品名、値段」のリストにまとめている。
値段が1000円以上の商品と値段を表示するために、正規表現によって該当部分を抽出する。
import re
# 駅弁情報(弁当屋、商品名、値段)
list = [
"南総弁当、元祖鱒寿し、1100円",
"福豆、元祖面構え鱒寿し、1500円",
"まるい館、さいほく釜めし、1200円",
"新杵本店、讃岐たいらぎ弁当、1100円",
"自笑商会、鯛のおにぎり、320円",
"阿部商会、沼津香まだい寿司、1050円",
"柳家、玄氣いなり、500円"
]
for shop in list:
m = re.match("[^、]*、[^、]*、\d+円$", shop)
print(m)
# -----------------------------------
# 出力
#<re.Match object; span=(0, 16), match='南総弁当、元祖鱒寿し、1100円'>
#<re.Match object; span=(0, 17), match='福豆、元祖面構え鱒寿し、1500円'>
#<re.Match object; span=(0, 18), match='まるい館、さいほく釜めし、1200円'>
#<re.Match object; span=(0, 19), match='新杵本店、讃岐たいらぎ弁当、1100円'>
#<re.Match object; span=(0, 16), match='自笑商会、鯛のおにぎり、320円'>
#<re.Match object; span=(0, 19), match='阿部商会、沼津香まだい寿司、1050円'>
#<re.Match object; span=(0, 13), match='柳家、玄氣いなり、500円'>
まずは上記のようにすべてを抽出できるように記述する。
パターンの意味は下記。
・【[^、]*】:「、」以外の文字が0回以上の繰り返し
・【\d+円$】:任意の数字を1回以上繰り返し、「円」で終わる
・【\d+円$】:任意の数字を1回以上繰り返し、「円」で終わる
値段で条件分岐を行い、商品名を表示するためにはグループ化を行う。
グループ化を行い箇所を括弧()で囲む。
import re
# 駅弁情報(弁当屋、商品名、値段)
list = [
"南総弁当、元祖鱒寿し、1100円",
"福豆、元祖面構え鱒寿し、1500円",
"まるい館、さいほく釜めし、1200円",
"新杵本店、讃岐たいらぎ弁当、1100円",
"自笑商会、鯛のおにぎり、320円",
"阿部商会、沼津香まだい寿司、1050円",
"柳家、玄氣いなり、500円"
]
for shop in list:
m = re.match("[^、]*、([^、]*)、(\d+)円$", shop)
print(m.group(0))
print(m.group(1))
print(m.group(2))
# -----------------------------------
# 出力
#南総弁当、元祖鱒寿し、1100円
#元祖鱒寿し
#1100
#福豆、元祖面構え鱒寿し、1500円
#元祖面構え鱒寿し
#1500
#まるい館、さいほく釜めし、1200円
#さいほく釜めし
#1200
#新杵本店、讃岐たいらぎ弁当、1100円
#讃岐たいらぎ弁当
#1100
#自笑商会、鯛のおにぎり、320円
#鯛のおにぎり
#320
#阿部商会、沼津香まだい寿司、1050円
#沼津香まだい寿司
#1050
#柳家、玄氣いなり、500円
#玄氣いなり
#500
上記により値段部分は取得できるので、あとは条件分岐を行って値段が1000円以上の商品と値段を表示する。
import re
# 駅弁情報(弁当屋、商品名、値段)
list = [
"南総弁当、元祖鱒寿し、1100円",
"福豆、元祖面構え鱒寿し、1500円",
"まるい館、さいほく釜めし、1200円",
"新杵本店、讃岐たいらぎ弁当、1100円",
"自笑商会、鯛のおにぎり、320円",
"阿部商会、沼津香まだい寿司、1050円",
"柳家、玄氣いなり、500円"
]
for shop in list:
m = re.match("[^、]*、([^、]*)、(\d+)円$", shop)
name = m.group(1)
price = m.group(2)
if 1000 <= int(price) :
print(f"{name}:{price}円")
# -----------------------------------
# 出力
#元祖鱒寿し:1100円
#元祖面構え鱒寿し:1500円
#さいほく釜めし:1200円
#讃岐たいらぎ弁当:1100円
#沼津香まだい寿司:1050円
正規表現②
以下は駅弁情報の分割文字を正規表現で分けてリストにする方法。
・/(半角スラッシュ)
・/(全角スラッシュ)
・\t(タブ)
・ (スラッシュの前後に半角スペース)
・/(全角スラッシュ)
・\t(タブ)
・ (スラッシュの前後に半角スペース)
「弁当屋、商品名、値段」に分割してリストを作成する。
import re
bento_list = [
"井筒、焼きたらこトロ鮭弁当、1000円/ あべちう館、えび千両ちらし、1300円",
"安藤食品、おたのしみ弁当、880円/ 東華商会、廣島上等弁当、1200円",
"釧祥軒、かしわめし、700円 /万葉軒、鯛すし、1100円",
"高崎本店、笹子餅 5ヶ入り、410円 //東華商店、お祭り弁当、1150円",
"古河,阿部松川店、とりめし、650円/駅弁大船食品、かにづくし、1080円"
]
for line in bento_list:
shops = re.split(r"\s*[//\t]+\s*", line)
for shop in shops:
print(shop)
# -----------------------------------
# 出力
#井筒、焼きたらこトロ鮭弁当、1000円
#あべちう館、えび千両ちらし、1300円
#安藤食品、おたのしみ弁当、880円
#東華商会、廣島上等弁当、1200円
#釧祥軒、かしわめし、700円
#万葉軒、鯛すし、1100円
#高崎本店、笹子餅 5ヶ入り、410円
#東華商店、お祭り弁当、1150円
#古河,阿部松川店、とりめし、650円
#駅弁大船食品、かにづくし、1080円
パターンの意味は下記。
・【\s*】:任意の空白文字が0回以上の繰り返し
・【[//\t]+】:「/」「/」「\t」のどれか1文字以上の繰り返し
・【[//\t]+】:「/」「/」「\t」のどれか1文字以上の繰り返し
正規表現③
以下はひらがなの弁当名だけ取得する方法。
import re
bento_list = [
"井筒、焼きたらこトロ鮭弁当、1000円/ あべちう館、えび千両ちらし、1300円",
"安藤食品、おたのしみ弁当、880円/ 東華商会、廣島上等弁当、1200円",
"釧祥軒、かしわめし、700円 /万葉軒、鯛すし、1100円",
"高崎本店、笹子餅 5ヶ入り、410円 //東華商店、お祭り弁当、1150円",
"古河,阿部松川店、とりめし、650円/駅弁大船食品、かにづくし、1080円"
]
for line in bento_list:
shops = re.split(r"\s*[//\t]+\s*", line)
for shop in shops:
bento_name = shop.split("、")[1]
if re.match("[ぁ-ゖ]+$", bento_name):
print(bento_name)
# -----------------------------------
# 出力
#かしわめし
#とりめし
#かにづくし
パターンの意味は下記。
・【[ぁ-ゖ]+$】:ひらがなのみが1文字以上の繰り返し
※【[\u3041-\u3096]】と記述してもOK
※【[あ-ん]】とも記述できるが、「ぁゔゕゖ」がマッチしない
※【[\u3041-\u3096]】と記述してもOK
※【[あ-ん]】とも記述できるが、「ぁゔゕゖ」がマッチしない
正規表現④
ひらがなとカタカナ以外の弁当名を取得する方法。
import re
bento_list = [
"井筒、焼きたらこトロ鮭弁当、1000円/ あべちう館、えび千両ちらし、1300円",
"安藤食品、おたのしみ弁当、880円/ 東華商会、廣島上等弁当、1200円",
"釧祥軒、かしわめし、700円 /万葉軒、鯛すし、1100円",
"高崎本店、笹子餅 5ヶ入り、410円 //東華商店、お祭り弁当、1150円",
"古河,阿部松川店、とりめし、650円/駅弁大船食品、かにづくし、1080円"
]
for line in bento_list:
shops = re.split(r"\s*[//\t]+\s*", line)
for shop in shops:
bento_name = shop.split("、")[1]
if re.match("[^ぁ-ゖァ-ヶ]+$", bento_name):
print(bento_name)
# -----------------------------------
# 出力
#廣島上等弁当
パターンの意味は下記。
・【[^ぁ-ゖァ-ヶ]+$】ひらがなとカタカナ以外の一文字以上の繰り返し
※【[ァ-ヶ]】はカタカナを表す
※【[ァ-ヶ]】はカタカナを表す
正規表現⑤
「●●弁当」のみ取得する方法。
import re
bento_list = [
"井筒、焼きたらこトロ鮭弁当、1000円/ あべちう館、えび千両ちらし、1300円",
"安藤食品、おたのしみ弁当、880円/ 東華商会、廣島上等弁当、1200円",
"釧祥軒、かしわめし、700円 /万葉軒、鯛すし、1100円",
"高崎本店、笹子餅 5ヶ入り、410円 //東華商店、お祭り弁当、1150円",
"古河,阿部松川店、とりめし、650円/駅弁大船食品、かにづくし、1080円"
]
for line in bento_list:
shops = re.split("\s*[//\t]+\s*", line)
for shop in shops:
m = re.search("、(.*弁当)", shop)
if m:
print(m.group(1))
# -----------------------------------
# 出力
#焼きたらこトロ鮭弁当
#おたのしみ弁当
#廣島上等弁当
#お祭り弁当
searchを使用する場合、matchと違って該当する文字列まわりの正規表現パターンだけでいい。