環境
- Windows 10
- Python 3.10.1
前提
pythonで正規表現を扱うには、 reモジュールをインポートする必要があります
import re
オーソドックスなやり方3種類
- findall(★個人的には一番使いやすい)
- match
- search
re.findall
- 正規表現にマッチするもの全てをリストにして返す
- 引数に正規表現のパターンと文字列を受ける
- findallの結果は以下の通り
- マッチする箇所があれば、マッチした箇所が格納された配列が返る
- マッチしなければ、空配列が返るが、今回は仕様上の都合で引数で受け取った文字列をそのまま返すようにしている
- 具体的な実装はshared\Application\check_regex_service.pyを参照ください
tests\test_check_regex_service.py
from shared.Domain.xregex import XRegex
from shared.Application.check_regex_service import CheckRegexService
from shared.Domain.xstr import XStr
import re
def test_正規表現に一致する文字列を返すこと():
xstr = XStr(
"https://zozo.jp/men-category/jacket-outerwear/tailored-jacket/?p_gtype=2"
)
xregex = XRegex(".+?(?=\?)")
assert (
CheckRegexService().execute(xregex, xstr=xstr)
== "https://zozo.jp/men-category/jacket-outerwear/tailored-jacket/"
)
def test_正規表現に一致する文字列がない場合は引数の文字列をそのまま返すこと():
xstr = XStr("hogemaru")
xregex = XRegex(".+?(?=\?)")
assert CheckRegexService().execute(xregex, xstr=xstr) == "hogemaru"
shared\Application\check_regex_service.py
import re
from shared.Domain.xregex import XRegex
from shared.Domain.xstr import XStr
# 正規表現に一致する文字列が含まれていればその文字列のマッチする部分を、含まれていなければ、文字列をそのまま返します
class CheckRegexService:
def execute(self, regex: XRegex, xstr:XStr):
match = re.findall(regex.get_pattern(), xstr.get_string())
if len(match) > 0:
return match[0]
else:
return xstr.get_string()
re.match
- 対象の文字の先頭から正規表現がマッチするかどうかをチェックする(探しているパターンが先頭にあればマッチするが、途中に含まれていてもマッチしない)
- マッチした箇所の文字列を取得するには、.group()でチェーンする必要がある(後述のsearchも同様)
- 返り値
- マッチオブジェクト (MatchObject)
- マッチしなかったときはNoneを返す
tests\test_check_regex_service.py
def test_正規表現に一致する文字列を返すこと_match():
# テーラードジャケット 対象商品(性別:メンズ)古着|テーラードジャケット(メンズ)
xstr = XStr(
"https://zozo.jp/men-category/jacket-outerwear/tailored-jacket/?p_gtype=2"
)
xregex = XRegex(".+?(?=\?)")
matches = re.match(xregex.get_pattern(), xstr.get_string())
assert (
matches.group()
== "https://zozo.jp/men-category/jacket-outerwear/tailored-jacket/"
)
re.search
- 対象の文字列の中でマッチする箇所があるかをチェックする
- パターンにマッチするのが2つ以上ある場合は最初の1つだけが返る
- マッチした箇所の文字列を取得するには、.group()でチェーンする必要がある
- 返り値
- マッチオブジェクト (MatchObject)
- マッチしなかったときはNoneを返す
tests\test_check_regex_service.py
以上です
まとめ
いかがでしたでしょうか。本記事では、Pythonで正規表現を使って文字列から部分文字列を抽出する方法について紹介しています。ぜひ参考にしてみてください