【re】Pythonで正規表現:matchとsearchメソッドの使用方法

概要

re.matchを使用して実際に演習してみたことをまとめる。

 

あわせて読みたい

概要 Pythonのreモジュールを使用して、正規表現をどのように使用するのかをまとめた。   正規表現のパターン 文字列から特定のパターンを探す際に、正規表現を使用する。パターンは[…]

 

演習

正規表現①

以下に駅弁の情報を利用して条件分岐を行う方法をまとめる。
駅弁の情報は「弁当屋、商品名、値段」のリストにまとめている。
値段が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回以上繰り返し、「円」で終わる

 

値段で条件分岐を行い、商品名を表示するためにはグループ化を行う。
グループ化を行い箇所を括弧()で囲む。


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(タブ)
・ (スラッシュの前後に半角スペース)

 

「弁当屋、商品名、値段」に分割してリストを作成する。


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文字以上の繰り返し

 

正規表現③

以下はひらがなの弁当名だけ取得する方法。


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
 ※【[あ-ん]】とも記述できるが、「ぁゔゕゖ」がマッチしない

 

正規表現④

ひらがなとカタカナ以外の弁当名を取得する方法。


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と違って該当する文字列まわりの正規表現パターンだけでいい。

スポンサーリンク