メインコンテンツにスキップ
モジュール 8 · レッスン 4 / 4コース内の 32/36~12 min
モジュールのレッスン (4/4)

re モジュール: Python の正規表現

re モジュールは、Python の正規表現を公開します。すでに服用している場合 このサイトの正規表現コースでは、すべての構文に慣れていることがわかります。ここで API を見てみましょう。

生の文字列: r"..."

正規表現では多くのバックスラッシュ (\d、\b、\s) が使用されます。常に次のように書きます 生の文字列なので、2 倍にする必要はありません。

Python
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: 最初の出現箇所を検索します

Python
import re
m = re.search(r"\d+", "ho 42 mele e 17 pere")
m.group()    # '42'
m.start()    # 3
m.end()      # 5

見つかった場合は Match オブジェクトを返し、見つからない場合は None を返します。慣用的なパターン:

Python
if m := re.search(r"\d+", testo):
    print(m.group())

re.match: 文字列の先頭のみ

Python
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: すべての発生

Python
re.findall(r"\d+", "ho 42 mele, 17 pere, 3 banane")
# ['42', '17', '3']

パターンに キャプチャ グループがある場合、findall はグループではなくグループを返します。 試合全体:

Python
re.findall(r"(\w+)@(\w+)", "ada@x bob@y")
# [('ada', 'x'), ('bob', 'y')]

re.sub: 置換

Python
re.sub(r"\d+", "###", "ho 42 mele e 17 pere")
# 'ho ### mele e ### pere'

また、置換関数 (Match を受け取る) とも連携します。

Python
re.sub(r"\d+", lambda m: str(int(m.group()) * 2), "ho 42 mele")
# 'ho 84 mele'

名前付きグループ

Python
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'}

便利なフラグ

Python
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 オブジェクトの遅延反復子が生成され、メモリの消費が最小限に抑えられます。

試してみてください

運動#python.m8.l4.e1
試行回数: 0読み込み中…

`text = 'ordine #123、total €45.50、ricevuta #456'` とすると、すべての注文番号 (# の後の数字) が文字列のリストとして `orders` に抽出されます。 「注文」を評価します。

エディターを読み込み中…
ヒントを表示

re.findall(r"#(\\d+)", text) — 数字のみのキャプチャ グループ。

3 回の試行後に解決策が利用可能になります

復習演習

運動#python.m8.l4.e2
試行回数: 0読み込み中…

`s = 'tel: 06-12345678 e tel: 02-9876'` とすると、すべての電話番号 (\\d+-\\d+ 形式) を文字列 'XXX' に置き換え、`masked` に割り当てます。 「マスク」を評価します。

エディターを読み込み中…
ヒントを表示

re.sub(r"\\d+-\\d+", "XXX", s)

3 回の試行後に解決策が利用可能になります

追加の課題

運動#python.m8.l4.e3
試行回数: 0読み込み中…

\`re\` モジュールをインポートします。文字列 \`log_line = "Error 404 in 15ms"\` から 1 つ以上の数字で構成されるすべての数値を抽出します。リストを \`numbers\` に保存し、評価します。

エディターを読み込み中…
ヒントを表示

re.findall(r'\\d+', log_line) を使用して、すべての数値を文字列のリストとして抽出します。

3 回の試行後に解決策が利用可能になります