# 正規表現したい(``re``) ```python import re re.match("正規表現パターン", "対象文字列") re.search("正規表現パターン", "対象文字列") ``` ``match``は文字列の先頭でのみマッチを確認し、 ``search``は文字列のどこでもマッチを確認する基本的な関数です。 それぞれの動作の違いの詳細は[search vs. match](https://docs.python.org/ja/3/library/re.html#search-vs-match)を参照してください。 ## IPアドレスを検索したい ```python matched = re.search("(\d{1,3}\.){3}\d{1,3}", "対象文字列") # IPv4 matched.group() ``` ```python matched = re.search("([0-9A-Fa-f]{0,4}:){7}[0-9A-Fa-f]{0,4}", "対象文字列") # IPv6 matched.group() ``` ``\d``は``[0-9]``を意味するメタ文字です。 IPv4アドレスに必要な3桁の整数値は``\d{1,3}``で表現できます。 これをピリオド(``.``)を使って4つ組み合わせています。 ```{note} ``\d{1,3}``は0--999にマッチします。 IPv4アドレス値は0--255(8ビット)しか取らないのですが、 これをきちんと書こうとするとめんどくさいので手を抜いています。 きちんと書くと ``(\d{1,2}|1\d{2}|2[0-5]{2})``(= 0--99 + 100--199 + 200--255)でしょうか。 ``` ## 16進数を検索したい ```python matched = re.search("[0-9A-Fa-f]", "対象文字列") matched.group() ``` 1桁の16進数は``[0-9A-Fa-f]``で表すことができます。 IPv6アドレスをマッチさせたい場合などに、この正規表現を繰り返して使います。 ## リファラーを検索したい ```python matched = re.search('\"[\S\s]+?\"', "対象文字列") matched = re.search('(?P(\"[\S\s]+?\"))', "対象文字列") matched.group("referer") ``` Apacheログに記録されているリファラー(``\"%{Referer}i\"``)やユーザーエージェント(``\"%{User-agent}i\"``)のように、``""``で囲まれたすべて文字列を検索できる正規表現です。 すべての文字を対象とするため``\S``(すべての非空白文字)と``\s``(すべての空白文字)のメタ文字を組み合わせています。 文字列の長さが分からないですが、あまりヒットさせすぎないように``+?``で最短マッチさせています。 ## Apacheのアクセスログを検索したい ```python regex_string = '(?P(\d{1,3}\.){3}\d{1,3}) (?P(\S+|-)) (?P(\S+|-)) (?P