Python正規表現(reモジュール)実践ガイド
Python正規表現(reモジュール)実践ガイド
Pythonのreモジュールで正規表現の力を活用する方法を発見。ステップバイステップ例で一般的パターン、マッチング技法、高度関数を解説。
正規表現とは?
正規表現(RegEx)は検索パターンを定義する文字シーケンスです。例えばパターン^a...s$はaで始まりsで終わる5文字文字列にマッチします。
^a...s$
パターンは文字列照合に使用できます。以下の表は異なる入力に対するパターン振る舞いを示します:
| 式 | 文字列 | マッチ? |
|---|---|---|
^a...s$ | abs | マッチなし |
alias | マッチ | |
abyss | マッチ | |
Alias | マッチなし | |
An abacus | マッチなし |
PythonのreモジュールはRegEx操作に必要なツールを提供。re.match()でパターンを文字列照合する簡単な例:
import re
pattern = '^a...s$'
test_string = 'abyss'
result = re.match(pattern, test_string)
if result:
print("Search successful.")
else:
print("Search unsuccessful.")
パターン発見時、re.match()はマッチオブジェクト返却;否则None。
メタ文字によるパターン指定
メタ文字は正規表現エンジンが特別な意味で解釈する特殊記号。主要メタ文字のクイックリファレンス:
[] . ^ $ * + ? {} () \ |
角括弧:[]
角括弧はマッチ対象文字セットを定義。例:[abc]はa、b、cのいずれか1文字にマッチ。
| 式 | 文字列 | マッチ? |
|---|---|---|
[abc] | a | 1マッチ |
ac | 2マッチ | |
Hey Jude | マッチなし | |
abc de ca | 5マッチ |
ハイフンで範囲指定可能、例:[a-e]は[abcde]と等価。セット反転は開き括弧直後にキャレット^、例:[^abc]はa、b、c以外の任意文字にマッチ。
ピリオド:.
ドットは改行以外の任意単一文字にマッチ。
| 式 | 文字列 | マッチ? |
|---|---|---|
.. | a | マッチなし |
ac | 1マッチ | |
acd | 1マッチ | |
acde | 2マッチ(4文字含む) |
キャレット:^とドル:$
キャレットは文字列先頭、ドルは文字列末尾をアサート。例:^aはaで始まる文字列、a$はaで終わる文字列にマッチ。
| 式 | 文字列 | マッチ? |
|---|---|---|
^a | a | 1マッチ |
abc | 1マッチ | |
bac | マッチなし | |
^ab | abc | 1マッチ |
acb | マッチなし(aで始まるがbが続かない) |
| 式 | 文字列 | マッチ? |
|---|---|---|
a$ | a | 1マッチ |
formula | 1マッチ | |
cab | マッチなし |
量指定子:*、+、?、{n,m}
これら記号は直前要素の出現回数を制御。
*— 0回以上+— 1回以上?— 0回または1回{n,m}— 少なくともn回、最大m回
例:
| 式 | 文字列 | マッチ? |
|---|---|---|
ma*n | mn | 1マッチ |
man | 1マッチ | |
maaan | 1マッチ | |
main | マッチなし(aがnに続かない) | |
woman | 1マッチ |
| 式 | 文字列 | マッチ? |
|---|---|---|
ma+n | mn | マッチなし(aなし) |
man | 1マッチ | |
maaan | 1マッチ | |
main | マッチなし(aがnに続かない) | |
woman | 1マッチ |
| 式 | 文字列 | マッチ? |
|---|---|---|
ma?n | mn | 1マッチ |
man | 1マッチ | |
maaan | マッチなし(aが1超) | |
main | マッチなし(aがnに続かない) | |
woman | 1マッチ |
| 式 | 文字列 | マッチ? |
|---|---|---|
a{2,3} | abc dat | マッチなし |
abc daat | 1マッチ(daatで) | |
aabc daaat | 2マッチ(aabcとdaaatで) | |
aabc daaaat | 2マッチ(aabcとdaaaatで) |
よく使われるパターン:[0-9]{2,4}は2〜4桁連続数字にマッチ。
| 式 | 文字列 | マッチ? |
|---|---|---|
[0-9]{2,4} | ab123csde | 1マッチ(ab123csdeで) |
12 and 345673 | 3マッチ(12、3456、73) | |
1 and 2 | マッチなし |
選択:|
垂直バーは論理OR実装。例:a|bはaまたはbを含む文字列にマッチ。
| 式 | 文字列 | マッチ? |
|---|---|---|
a|b | cde | マッチなし |
ade | 1マッチ(adeで) | |
acdbea | 3マッチ(acdbeaで) |
グループ化:()
括弧でサブパターンをグループ化し、マッチ部分文字列を捕捉。例:(a|b|c)xzはa、b、cのいずれかにxzが続く文字列にマッチ。
| 式 | 文字列 | マッチ? |
|---|---|---|
(a|b|c)xz | ab xz | マッチなし |
abxz | 1マッチ(abxzで) | |
axz cabxz | 2マッチ(axzbc cabxzで) |
エスケープ:\
バックスラッシュでメタ文字をリテラル扱い。例:\$aは$を行末アンカーと解釈せずリテラル$aシーケンスにマッチ。
特殊シーケンス
特殊シーケンスは一般的パターンを簡素化。以下はリファレンスリストと例示例。
文字列先頭:\A
| 式 | 文字列 | マッチ? |
|---|---|---|
\Athe | the sun | マッチ |
In the sun | マッチなし |
単語境界:\b
| 式 | 文字列 | マッチ? |
|---|---|---|
\bfoo | football | マッチ |
a football | マッチ | |
afootball | マッチなし | |
foo\b | the foo | マッチ |
the afoo test | マッチ | |
the afootest | マッチなし |
非単語境界:\B
| 式 | 文字列 | マッチ? |
|---|---|---|
\Bfoo | football | マッチなし |
a football | マッチなし | |
afootball | マッチ | |
foo\B | the foo | マッチなし |
the afoo test | マッチなし | |
the afootest | マッチ |
数字:\d / 非数字:\D
| 式 | 文字列 | マッチ? |
|---|---|---|
\d | 12abc3 | 3マッチ(12abc3で) |
Python | マッチなし | |
\D | 1ab34"50 | 3マッチ(1ab34"50で) |
1345 | マッチなし |
空白:\s / 非空白:\S
| 式 | 文字列 | マッチ? |
|---|---|---|
\s | Python RegEx | 1マッチ |
PythonRegEx | マッチなし | |
\S | a b | 2マッチ( a bで) |
| マッチなし |
単語文字:\w / 非単語:\W
| 式 | 文字列 | マッチ? |
|---|---|---|
\w | 12&": ;c | 3マッチ(12": ;cで) |
"%> ! | マッチなし | |
\W | 1a2%c | 1マッチ(1a2%cで) |
Python | マッチなし |
文字列末尾:\Z
| 式 | 文字列 | マッチ? |
|---|---|---|
Python\Z | I like Python | 1マッチ |
I like Python Programming | マッチなし | |
Python is fun. | マッチなし |
ヒント: regex101のようなオンライン正規表現テスターでパターンを素早く作成・デバッグ。
PythonでのRegEx使用
Pythonのreモジュールは正規表現操作のための豊富な関数と定数を提供。インポート:
import re
以下は最も一般的なユーティリティと使用法。
re.findall()
文字列内のすべての非重複マッチをリスト返却。
# 文字列からすべての数字抽出
import re
string = 'hello 12 hi 89. Howdy 34'
pattern = '\d+'
result = re.findall(pattern, string)
print(result) # 出力: ['12', '89', '34']
マッチなし時は空リスト返却。
re.split()
パターンマッチ箇所で文字列分割、部分文字列リスト返却。
import re
string = 'Twelve:12 Eighty nine:89.'
pattern = '\d+'
result = re.split(pattern, string)
print(result) # 出力: ['Twelve:', ' Eighty nine:', '.']
オプションmaxsplitで分割数制限可能。0(デフォルト)は全マッチで分割。
import re
string = 'Twelve:12 Eighty nine:89 Nine:9.'
pattern = '\d+'
# 最初の出現のみで分割
result = re.split(pattern, string, 1)
print(result) # 出力: ['Twelve:', ' Eighty nine:89 Nine:9.']
re.sub()
パターンのすべての出現を置換文字列で置換。
# すべての空白文字削除
import re
string = 'abc 12\nde 23 \n f45 6'
pattern = '\s+'
replace = ''
new_string = re.sub(pattern, replace, string)
print(new_string) # 出力: abc12de23f456
置換数制限はcount引数。0で全マッチ置換。
new_string = re.sub(r'\s+', replace, string, 1)
print(new_string) # 出力:
# abc12de 23
# f45 6
re.subn()
re.sub()類似だが、新文字列と置換実行回数のタプル返却。
new_string = re.subn(pattern, replace, string)
print(new_string) # 出力: ('abc12de23f456', 4)
re.search()
パターンマッチ最初の位置を検索。
string = "Python is fun"
match = re.search('\\APython', string)
if match:
print("pattern found inside the string")
else:
print("pattern not found")
# 出力: pattern found inside the string
マッチオブジェクト
マッチ発見時、re.search()はMatchオブジェクト返却。主なメソッド/属性:
group()— マッチ部分文字列start()/end()— マッチインデックスspan()— (start, end)タプルgroups()— すべての捕捉グループ
string = '39801 356, 2102 1111'
pattern = '(\\d{3}) (\\d{2})'
match = re.search(pattern, string)
if match:
print(match.group())
print(match.group(1))
print(match.group(2))
print(match.groups())
print(match.start(), match.end(), match.span())
else:
print("pattern not found")
# 出力:
# 801 35
# 801
# 35
# ('801', '35')
# 2 8 (2, 8)
Raw文字列使用(プレフィックスr)
文字列リテラルにrプレフィックスでバックスラッシュをリテラル扱い、意図せぬエスケープシーケンス防止。正規表現パターンで特に有用。
string = '\n and \r are escape sequences.'
result = re.findall(r'[\n\r]', string)
print(result) # 出力: ['\n', '\r']
reモジュールの更なる探求は公式Pythonドキュメントを参照。
Python
- Python キーワードと識別子: 予約語と命名規則をマスター
- Python データ型マスター: 実践ガイド
- Python 演算子完全マスター: 包括的ガイド
- Python pass文完全マスター: 実践ガイド
- Python 関数引数完全マスター: 位置引数・キーワード引数・デフォルト引数
- Python辞書完全ガイド:作成、操作、高度なテクニック
- Pythonイテレータ完全ガイド:仕組みと自作方法
- Pythonクロージャ解説:ネスト関数が変数を捕捉する仕組み
- Python datetimeマスター:日付・時刻・タイムゾーン実践ガイド
- Pythonのtimeモジュールをマスター:関数、構造体、実践例
- Pythonのtime.sleep()をマスター:ベストプラクティス、マルチスレッド、実例