モジュールのレッスン (4/4)
re モジュール: Python の正規表現
re モジュールは、Python の正規表現を公開します。すでに服用している場合
このサイトの正規表現コースでは、すべての構文に慣れていることがわかります。ここで
API を見てみましょう。
生の文字列: r"..."
正規表現では多くのバックスラッシュ (\d、\b、\s) が使用されます。常に次のように書きます
生の文字列なので、2 倍にする必要はありません。
import re
# raw: \d is a single token
pattern = r"\d+"
# NOT raw: you would have to write "\\d+" otherwise Python interprets \d as "d"re.search: 最初の出現箇所を検索します
import re
m = re.search(r"\d+", "ho 42 mele e 17 pere")
m.group() # '42'
m.start() # 3
m.end() # 5見つかった場合は Match オブジェクトを返し、見つからない場合は None を返します。慣用的なパターン:
if m := re.search(r"\d+", testo):
print(m.group())re.match: 文字列の先頭のみ
re.match(r"\d+", "42 anni") # match!
re.match(r"\d+", "ho 42 anni") # None (doesn't start with a digit)どこでも検索するには、re.search を使用してください。
re.findall: すべての発生
re.findall(r"\d+", "ho 42 mele, 17 pere, 3 banane")
# ['42', '17', '3']パターンに キャプチャ グループがある場合、findall はグループではなくグループを返します。
試合全体:
re.findall(r"(\w+)@(\w+)", "ada@x bob@y")
# [('ada', 'x'), ('bob', 'y')]re.sub: 置換
re.sub(r"\d+", "###", "ho 42 mele e 17 pere")
# 'ho ### mele e ### pere'また、置換関数 (Match を受け取る) とも連携します。
re.sub(r"\d+", lambda m: str(int(m.group()) * 2), "ho 42 mele")
# 'ho 84 mele'名前付きグループ
m = re.search(r"(?P<anno>\d{4})-(?P<mese>\d{2})-(?P<giorno>\d{2})", "2025-01-15")
m.group("anno") # '2025'
m.groupdict() # {'anno': '2025', 'mese': '01', 'giorno': '15'}便利なフラグ
re.search(r"ciao", "CIAO", re.IGNORECASE) # case-insensitive
re.findall(r"^.+$", testo, re.MULTILINE) # ^/$ match every line
re.search(r"a.b", "a\nb", re.DOTALL) # . matches newline tooメモリ安全のための re.finder
巨大なテキスト ブロック内の一致を処理する必要がある場合、re.findall は、抽出されたすべての一致文字列を含むリストをメモリ内に割り当てます。 re.finditer() を使用することをお勧めします。これにより、Match オブジェクトの遅延反復子が生成され、メモリの消費が最小限に抑えられます。
試してみてください
`text = 'ordine #123、total €45.50、ricevuta #456'` とすると、すべての注文番号 (# の後の数字) が文字列のリストとして `orders` に抽出されます。 「注文」を評価します。
ヒントを表示
re.findall(r"#(\\d+)", text) — 数字のみのキャプチャ グループ。
3 回の試行後に解決策が利用可能になります
復習演習
`s = 'tel: 06-12345678 e tel: 02-9876'` とすると、すべての電話番号 (\\d+-\\d+ 形式) を文字列 'XXX' に置き換え、`masked` に割り当てます。 「マスク」を評価します。
ヒントを表示
re.sub(r"\\d+-\\d+", "XXX", s)
3 回の試行後に解決策が利用可能になります
追加の課題
\`re\` モジュールをインポートします。文字列 \`log_line = "Error 404 in 15ms"\` から 1 つ以上の数字で構成されるすべての数値を抽出します。リストを \`numbers\` に保存し、評価します。
ヒントを表示
re.findall(r'\\d+', log_line) を使用して、すべての数値を文字列のリストとして抽出します。
3 回の試行後に解決策が利用可能になります