re【正規表現】3.1 / 3.3 / 3.4 / 3.6~3.8

メモ ( 概要 モジュール・オブジェクト 基本操作 ) 検索フラグ 正規表現パターン 属性一覧 メソッド一覧 検索 全検索 全検索 (イテレータ) 分割 置換 キャプチャ参照 マッチ位置インデックス

メモ

概要

モジュール・オブジェクト

基本操作


検索フラグ・正規表現パターン

検索フラグ備考
re.A
re.ASCII
ASCII 文字限定
re.DEBUGデバッグ情報表示
re.I
re.IGNORECASE
大小文字の区別なし
re.L
re.LOCALE
大小文字の区別なし (ロケール)
( バイト文字列 (bytes)のみ可 3.6 )
re.M
re.MULTILINE
複数行検索
( ^【先頭】$【末尾】を各行に対応 )
re.S
re.DOTALL
改行検索
( .【改行以外の文字】を改行も対応 )
re.U
re.UNICODE
Unicode 対応 (後方互換の為、冗長)
re.X
re.VERBOSE
コメント対応
正規表現パターン備考
.改行以外の文字 ( DOTALL【改行検索】指定:改行を含む )
^先頭 ( MULTILINE【複数行検索】指定:各行の先頭を含む )
$末尾 ( MULTILINE【複数行検索】指定:各行の末尾を含む )
パターン* パターンの 0 回以上の繰り返し ( 最長一致 )
パターン*? パターンの 0 回以上の繰り返し ( 最短一致 )
パターン+パターンの 1 回以上の繰り返し ( 最長一致 )
パターン+?パターンの 1 回以上の繰り返し ( 最短一致 )
パターン?パターンの 0 回か 1 回 ( 最長一致 )
パターン??パターンの 0 回か 1 回 ( 最短一致 )
パターン{m} パターンm 回の繰り返し ( m:正数 )
パターン{m,n} パターンm 回 ~ n 回の繰り返し ( 最長一致 )
( mn:正数 / m または n は省略可能 )
パターン{m,n}? パターンm 回 ~ n 回の繰り返し ( 最短一致 )
( mn:正数 / m または n は省略可能 )
[文字の集合] 集合:文字の集合 内の文字 ( - で範囲指定 )
[^文字の集合] 補集合:文字の集合 内の文字以外
パターンA|パターンB パターンを区切り、どちらかのパターンと一致
(パターン) キャプチャ (後方参照:\キャプチャ番号)
(?:パターン) キャプチャ (後方参照不可)
(?P<キャプチャ名> パターン) 名前付きキャプチャ
( 後方参照:(?P=キャプチャ名)\キャプチャ番号 )
(?P=キャプチャ名) 名前付きキャプチャの後方参照
( 名前付きキャプチャ: (?P<キャプチャ名>パターン) )
(?(キャプチャ番号 / キャプチャ名) 存在ありパターン |存在なしパターン) キャプチャ存在判定
存在なしパターン は省略可
( 対になった括弧のチェック等に有用 )
(?#コメント)コメント
パターン(?=パターン (後)) 肯定先読みパターンパターン (後) が続く
パターン(?!パターン (後)) 否定先読みパターンパターン (後) が続かない
(?<=パターン (前))パターン 肯定後読みパターン (前)パターン が続く
(?<!パターン (前))パターン 否定後読みパターン (前) でない後に パターン が続く
(?aiLmsux) 検索フラグ指定 ( 全体 )
aiLmsux の1個以上を指定 (以下に対応)
re.A【ASCII 文字限定】
re.I【大小文字の区別なし】
re.L【大小文字の区別なし (ロケール)】
re.M【複数行検索】
re.S【改行検索】
re.U【Unicode 対応 (後方互換)】
re.X【コメント対応】
(?aiLmsux-imsx: パターン) 3.6 検索フラグ設定・解除 ( 個別 )
設定する aiLmsux の0個以上
- 解除する imsx の1個以上を指定 (省略可)
対応フラグ:(?aiLmsux) 参照 ( aLu 追加 3.7 )
\~エスケープシーケンス (以下参照)
未定義の ASCII 文字指定はエラー 3.6
\ooo8進数定義 (先頭が0 または 3桁)
\キャプチャ番号 (1~99)キャプチャの後方参照
\\バックスラッシュ
\aビープ音 (\u0007)
\A文字列の先頭
\b単語の区切り ( アンダースコア(_) を含む )
( ASCII フラグ指定:ASCII 限定 )
\B単語の区切り以外 ( アンダースコア(_) を含まない )
( ASCII フラグ指定:ASCII 限定 )
\d 文字列 (str):10進数
( ASCII フラグ指定:ASCII 限定 / [0-9] と等価 )
バイト文字列 (bytes):10 進数 ( [0-9] と等価 )
\D 非 10 進数 (\d の逆)
( ASCII フラグ指定:ASCII 限定 / [^0-9] と等価 )
\f改ページ (\u000C)
\n改行 (\u000A)
\N{Unicode 文字名} 3.8 Unicode 文字
(例:\N{COPYRIGHT SIGN} )
\r復帰 (\u000D)
\s 文字列 (str):空白文字 ( ASCII フラグ指定:ASCII 限定  / [ \t\n\r\f\v] と等価 )
バイト文字列 (bytes):空白文字 ( [ \t\n\r\f\v] と等価 )
\S 空白文字以外 (\s の逆)
( ASCII フラグ指定:ASCII 限定 / [^ \t\n\r\f\v] と等価 )
\tタブ (\u0009)
\uhhhh 3.316進数定義 (16 bit)
バイト文字列 (bytes):エラー
\Uhhhhhhhh 3.316進数定義 (32 bit)
バイト文字列 (bytes):エラー
\v垂直タブ (\u000B)
\w 文字列 (str):単語文字 ( 文字・数字・アンダースコア(_) )
( ASCII フラグ指定:ASCII 限定 / [a-zA-Z0-9_] と等価 )
バイト文字列 (bytes):[a-zA-Z0-9_] と等価
\W単語文字以外 ( \w の逆 )
\xhh16進数定義 (8 bit)
\Z文字列の末尾

パターン:検索位置移動
パターン:検索位置移動なし


属性・メソッド・例外クラス

属性備考
Pattern
Pattern.flags検索フラグ
Pattern.groupsキャプチャ数
Pattern.groupindexキャプチャ名辞書 (キャプチャ名・キャプチャ番号)
Pattern.pattern正規表現パターン
Match
Match[ g ] 3.6 キャプチャ参照
g:キャプチャ番号 または キャプチャ名
    キャプチャ番号 (0):マッチ文字列全体
    キャプチャ番号 (1~):対応するキャプチャ値
    キャプチャ名:対応するキャプチャ値
(参照:__getitem__【キャプチャ参照 (添字参照)】3.6)
Match.endpos検索最終位置インデックス
Match.lastindex最終キャプチャ番号
Match.lastgroup最終キャプチャ名
不一致 または キャプチャ名が未指定:None
Match.pos検索開始位置インデックス
Match.re正規表現オブジェクト
Match.string検索元文字列
メソッドrePatternMatch戻り値
__getitem__【キャプチャ参照 (添字参照)】3.6 マッチ文字列
(参照:キャプチャ参照 属性)
compile【コンパイル】 Pattern【正規表現オブジェクト】
end【マッチ位置インデックス (末尾)】末尾のマッチ位置インデックス
escape【特殊文字エスケープ】エスケープ後の文字列
expand【キャプチャ参照展開】展開後の文字列
findall【全検索】検索結果リスト【list】
finditer【全検索 (イテレータ)】 イテレータ (Match【マッチオブジェクト】)
fullmatch【検索 (全体一致)】 Match【マッチオブジェクト】
group【キャプチャ参照】 引数0個:マッチ文字列全体
引数1個:マッチ文字列
引数2個以上:マッチ文字列のタプル
groupdict【キャプチャ参照 (辞書)】辞書 (キャプチャ名・キャプチャ値)
groups【キャプチャ参照 (タプル)】タプル (キャプチャ値)
match【検索 (先頭一致)】 Match【マッチオブジェクト】
purge【正規表現キャッシュ クリア】なし
search【検索】Match【マッチオブジェクト】
span【マッチ位置インデックス】マッチ位置インデックス (タプル:先頭・末尾)
split【分割】分割リスト【list】
start【マッチ位置インデックス (先頭)】先頭のマッチ位置インデックス
sub【置換】置換後の文字列
subn【置換・置換個数取得】タプル (置換後の文字列・置換個数)
例外クラス属性 3.5備考
re.error(msg, pattern=None, pos=None) msgエラーメッセージ
pattern正規表現パターン
posエラー発生位置インデックス
linenopos に対応する行
colnopos に対応する列

compile【コンパイル】

メモ

構文

re.compile(pattern, flags=0)

戻り値Pattern【正規表現オブジェクト】
pattern正規表現パターン
flags検索フラグ
例外re.error

import re

s1 = 'The quick brown fox jumps over the lazy dog.'
s2 = 'THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG.'

pattern = re.compile(r'(\w+) (\w+)')

matched = pattern.search(s1)
print(matched)
# 出力:<re.Match object; span=(0, 9), match='The quick'>
print(matched.lastindex, matched[0], matched[1], matched[2], sep='/')
# 出力:2/The quick/The/quick

matched = pattern.search(s2)
print(matched)
# 出力:<re.Match object; span=(0, 9), match='THE QUICK'>
print(matched.lastindex, matched[0], matched[1], matched[2], sep='/')
# 出力:2/THE QUICK/THE/QUICK

メモ

構文

re.search(pattern, string, flags=0)
re.match(pattern, string, flags=0)
re.fullmatch(pattern, string, flags=0) 3.4

Pattern.search(string[, pos[, endpos]])
Pattern.match(string[, pos[, endpos]])
Pattern.fullmatch(string[, pos[, endpos]]) 3.4

戻り値Match【マッチオブジェクト】 (一致無し:None)
pattern正規表現パターン
string検索元文字列
flags検索フラグ
pos検索開始位置インデックス (省略:0)
endpos検索終了位置インデックス
例外re.error

import re

s = 'The quick brown fox jumps over the lazy dog.'

matched = re.search(r'\w*x\w*', s)
print(matched)
# 出力:<re.Match object; span=(16, 19), match='fox'>
print(matched[0])
# 出力:fox

matched = re.search(r'\w*y\w*', s)
print(matched)
# 出力:<re.Match object; span=(35, 39), match='lazy'>
print(matched[0])
# 出力:lazy

matched = re.search(r'\w*z\w*', s)
print(matched)
# 出力:<re.Match object; span=(35, 39), match='lazy'>
print(matched[0])
# 出力:lazy

matched = re.search(r'\w*@\w*', s)
print(matched)
# 出力:None

pattern = re.compile(r'\w+')

matched = pattern.search(s)
print(matched)
# 出力:<re.Match object; span=(0, 3), match='The'>
print(matched[0])
# 出力:The

matched = pattern.search(s, matched.end())
print(matched)
# 出力:<re.Match object; span=(4, 9), match='quick'>
print(matched[0])
# 出力:quick

matched = pattern.search(s, matched.end())
print(matched)
# 出力:<re.Match object; span=(10, 15), match='brown'>
print(matched[0])
# 出力:brown
import re

s = 'The quick brown fox jumps over the lazy dog.'
p1 = r'\w*h\w*'
p2 = r'\w*x\w*'

matched = re.match(p1, s)
print(matched)
# 出力:<re.Match object; span=(0, 3), match='The'>
print(matched[0])
# 出力:The

matched = re.match(p2, s)
print(matched)
# 出力:None

pattern = re.compile(p1)
matched = pattern.match(s)
print(matched)
# 出力:<re.Match object; span=(0, 3), match='The'>
print(matched[0])
# 出力:The

pattern = re.compile(p2)
matched = pattern.match(s)
print(matched)
# 出力:None
import re

s = 'abc_xyz'
p1 = r'a\w*z'
p2 = r'z\w*a'

matched = re.fullmatch(p1, s)
print(matched)
# 出力:<re.Match object; span=(0, 7), match='abc_xyz'>
print(matched[0])
# 出力:abc_xyz

matched = re.fullmatch(p2, s)
print(matched)
# 出力:None

pattern = re.compile(p1)
matched = pattern.fullmatch(s)
print(matched)
# 出力:<re.Match object; span=(0, 7), match='abc_xyz'>
print(matched[0])
# 出力:abc_xyz

pattern = re.compile(p2)
matched = pattern.fullmatch(s)
print(matched)
# 出力:None

split【分割】

メモ

構文

re.split(pattern, string, maxsplit=0, flags=0)
Pattern.split(string, maxsplit=0)

戻り値分割リスト【list】
pattern正規表現パターン
string分割元文字列
maxsplit最大分割数 (0:制限なし)
flags検索フラグ 3.1
例外re.error

import re

s = 'The quick brown fox jumps over the lazy dog.'

print(re.split(' ', s))
# 出力:['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog.']

print(re.split(' ', s, 3))
# 出力:['The', 'quick', 'brown', 'fox jumps over the lazy dog.']

pattern = re.compile(' ')

print(pattern.split(s))
# 出力:['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog.']

print(pattern.split(s, 3))
# 出力:['The', 'quick', 'brown', 'fox jumps over the lazy dog.']

findall【全検索】

メモ

構文

re.findall(pattern, string, flags=0)
Pattern.findall(string[, pos[, endpos]])

戻り値検索結果リスト【list】
キャプチャ2個未満:文字列のリスト
キャプチャ2個以上:キャプチャのタプルのリスト
pattern正規表現パターン
string検索元文字列
flags検索フラグ
pos検索開始位置インデックス (省略:0)
endpos検索終了位置インデックス
例外re.error

import re

s = 'The quick brown fox jumps over the lazy dog.'

print(re.findall(r'\w+', s))
# 出力:['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog']

print(re.findall(r'(\w+)', s))
# 出力:['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog']

print(re.findall(r'(\w+) (\w+)', s))
# 出力:[('The', 'quick'), ('brown', 'fox'), ('jumps', 'over'), ('the', 'lazy')]

pattern = re.compile(r'\w+')

print(pattern.findall(s))
# 出力:['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog']

print(pattern.findall(s, 4, 19))
# 出力:['quick', 'brown', 'fox']

finditer【全検索 (イテレータ)】

メモ

構文

re.finditer(pattern, string, flags=0)
Pattern.finditer(string[, pos[, endpos]])

戻り値イテレータ (Match【マッチオブジェクト】)
pattern正規表現パターン
string検索元文字列
flags検索フラグ
pos検索開始位置インデックス (省略:0)
endpos検索終了位置インデックス
例外re.error

import re

s = 'The quick brown fox jumps over the lazy dog.'

for matched in re.finditer(r'\w+', s):
    print(matched[0], matched)
# 出力:The <re.Match object; span=(0, 3), match='The'>
# 出力:quick <re.Match object; span=(4, 9), match='quick'>
# 出力:brown <re.Match object; span=(10, 15), match='brown'>
# 出力:fox <re.Match object; span=(16, 19), match='fox'>
# 出力:jumps <re.Match object; span=(20, 25), match='jumps'>
# 出力:over <re.Match object; span=(26, 30), match='over'>
# 出力:the <re.Match object; span=(31, 34), match='the'>
# 出力:lazy <re.Match object; span=(35, 39), match='lazy'>
# 出力:dog <re.Match object; span=(40, 43), match='dog'>

pattern = re.compile(r'\w+')
for matched in pattern.finditer(s):
    print(matched[0], matched)
# 出力:The <re.Match object; span=(0, 3), match='The'>
# 出力:quick <re.Match object; span=(4, 9), match='quick'>
# 出力:brown <re.Match object; span=(10, 15), match='brown'>
# 出力:fox <re.Match object; span=(16, 19), match='fox'>
# 出力:jumps <re.Match object; span=(20, 25), match='jumps'>
# 出力:over <re.Match object; span=(26, 30), match='over'>
# 出力:the <re.Match object; span=(31, 34), match='the'>
# 出力:lazy <re.Match object; span=(35, 39), match='lazy'>
# 出力:dog <re.Match object; span=(40, 43), match='dog'>

for matched in pattern.finditer(s, 4, 19):
    print(matched[0], matched)
# 出力:quick <re.Match object; span=(4, 9), match='quick'>
# 出力:brown <re.Match object; span=(10, 15), match='brown'>
# 出力:fox <re.Match object; span=(16, 19), match='fox'>

sub【置換】
subn【置換・置換個数取得】

メモ

構文

re.sub(pattern, repl, string, count=0, flags=0 3.1)
re.subn(pattern, repl, string, count=0, flags=0 3.1)

Pattern.sub(repl, string, count=0)
Pattern.subn(repl, string, count=0)

戻り値処理結果
sub()置換後の文字列
subn()タプル (置換後の文字列, 置換個数)
pattern置換パターン (正規表現パターンPattern【正規表現オブジェクト】)
repl置換文字列 または 置換文字列を返却する置換関数 (引数:Match【マッチオブジェクト】)
(キャプチャの参照については、メモ 参照)
string置換元文字列
count最大置換数 (0:全置換)
flags検索フラグ
例外re.error

import re

s = 'The quick brown fox jumps over the lazy dog.'
p = r'\s'
repl = ' / '

print(re.sub(p, repl, s))
# 出力:The / quick / brown / fox / jumps / over / the / lazy / dog.
print(re.subn(p, repl, s, 3))
# 出力:('The / quick / brown / fox jumps over the lazy dog.', 3)

pattern = re.compile(p)
print(pattern.sub(repl, s))
# 出力:The / quick / brown / fox / jumps / over / the / lazy / dog.
print(pattern.subn(repl, s, 3))
# 出力:('The / quick / brown / fox jumps over the lazy dog.', 3)
import re

s = 'The quick brown fox jumps over the lazy dog.'
p = r'(\w+) (?P<group2>\w+) (\w+)'
repl = r'[\3 \g<group2> \g<1>]'

print(re.sub(p, repl, s))
# 出力:[brown quick The] [over jumps fox] [dog lazy the].
print(re.subn(p, repl, s, 2))
# 出力:('[brown quick The] [over jumps fox] the lazy dog.', 2)

pattern = re.compile(p)
print(pattern.sub(repl, s))
# 出力:[brown quick The] [over jumps fox] [dog lazy the].
print(pattern.subn(repl, s, 2))
# 出力:('[brown quick The] [over jumps fox] the lazy dog.', 2)
import re

def func_repl(matched):
    s = matched.group(0)
    return s + '(' + str(len(s)) + ')'

s = 'The quick brown fox jumps over the lazy dog.'
p = r'\w+'

print(re.sub(p, func_repl, s))
# 出力:The(3) quick(5) brown(5) fox(3) jumps(5) over(4) the(3) lazy(4) dog(3).
print(re.subn(p, func_repl, s, 3))
# 出力:('The(3) quick(5) brown(5) fox jumps over the lazy dog.', 3)

pattern = re.compile(p)
print(pattern.sub(func_repl, s))
# 出力:The(3) quick(5) brown(5) fox(3) jumps(5) over(4) the(3) lazy(4) dog(3).
print(pattern.subn(func_repl, s, 3))
# 出力:('The(3) quick(5) brown(5) fox jumps over the lazy dog.', 3)
import re

def func_repl(matched):
    return '[' + matched.group('group2') + ' ' + matched.group(1) + ']'

s = 'The quick brown fox jumps over the lazy dog.'
p = r'(\w+) (?P<group2>\w+)'
pattern = re.compile(p)

print(re.sub(p, func_repl, s))
# 出力:[quick The] [fox brown] [over jumps] [lazy the] dog.
print(re.sub(pattern, func_repl, s))
# 出力:[quick The] [fox brown] [over jumps] [lazy the] dog.
print(pattern.sub(func_repl, s))
# 出力:[quick The] [fox brown] [over jumps] [lazy the] dog.

print(re.subn(p, func_repl, s, 2))
# 出力:('[quick The] [fox brown] jumps over the lazy dog.', 2)
print(re.subn(pattern, func_repl, s, 2))
# 出力:('[quick The] [fox brown] jumps over the lazy dog.', 2)
print(pattern.subn(func_repl, s, 2))
# 出力:('[quick The] [fox brown] jumps over the lazy dog.', 2)

escape【特殊文字エスケープ】

メモ

構文

re.escape(pattern)

戻り値エスケープ後の文字列
pattern文字列

import re

print(re.escape('abc()[].+*?XYZ'))
# 出力:abc\(\)\[\]\.\+\*\?XYZ

purge【正規表現キャッシュ クリア】

メモ

  • 正規表現キャッシュのクリア
  • 関連

構文

re.purge()

戻り値なし

Match.expand【キャプチャ参照展開】3.6

メモ

構文

Match.expand(template)

戻り値展開後の文字列
templateテンプレート文字列 (キャプチャの参照については、メモ 参照)
例外re.error

import re

s = 'The quick brown fox jumps over the lazy dog.'
matched = re.search(r'(\w+) (?P<group2>\w+) (\w+) (?P<group4>\w+)', s)
print(matched)
# 出力:<re.Match object; span=(0, 19), match='The quick brown fox'>
print(matched[1], matched[2], matched[3], matched[4], sep='/')
# 出力:The/quick/brown/fox
print(matched.expand(r'\g<group4> \g<3> \g<group2> \1'))
# 出力:fox brown quick The

Match.__getitem__【キャプチャ参照 (添字参照)】3.6
Match.group【キャプチャ参照】
Match.groupdict【キャプチャ参照 (辞書)】
Match.groups【キャプチャ参照 (タプル)】

メモ

構文

Match.__getitem__(g) 3.6Match[g] で参照

戻り値キャプチャ値
gキャプチャ番号 または キャプチャ名
    キャプチャ番号 (0):マッチ文字列全体
    キャプチャ番号 (1~):対応するキャプチャ値
    キャプチャ名:対応するキャプチャ値
例外IndexError
Match.group([group1, ...])

戻り値
引数0個:マッチ文字列全体
引数1個:キャプチャ値
引数2個以上:キャプチャ値のtuple【タプル型】
groupNキャプチャ番号 または キャプチャ名
    キャプチャ番号 (0):マッチ文字列全体
    キャプチャ番号 (1~):対応するキャプチャ値
    キャプチャ名:対応するキャプチャ値
例外IndexError
Match.groupdict(default=None)

戻り値dict【辞書型】 (キャプチャ名: キャプチャ値)
default一致しないキャプチャの対応値
Match.groups(default=None)

戻り値tuple【タプル型】 (キャプチャ値)
default一致しないキャプチャの対応値

import re

s = 'The quick brown fox jumps over the lazy dog.'
matched = re.search(r'(\w+) (?P<group2>\w+) (\w+) (?P<group4>\w+)', s)
print(matched[0])
# 出力:The quick brown fox
print(matched[1])
# 出力:The
print(matched[2])
# 出力:quick
print(matched[3])
# 出力:brown
print(matched[4])
# 出力:fox
print(matched['group2'])
# 出力:quick
print(matched['group4'])
# 出力:fox
import re

s = 'The quick brown fox jumps over the lazy dog.'
matched = re.search(r'(\w+) (?P<group2>\w+) (\w+) (?P<group4>\w+)', s)
print(matched.group(0))
# 出力:The quick brown fox
print(matched.group(1))
# 出力:The
print(matched.group(2))
# 出力:quick
print(matched.group(3))
# 出力:brown
print(matched.group(4))
# 出力:fox
print(matched.group('group2'))
# 出力:quick
print(matched.group('group4'))
# 出力:fox
print(matched.group(3, 'group4'))
# 出力:('brown', 'fox')
import re

s = 'The quick brown fox jumps over the lazy dog.'
matched = re.search(r'(\w+) (?P<group2>\w+) (\w+) (?P<group4>\w+)', s)
print(matched.groupdict())
# 出力:{'group2': 'quick', 'group4': 'fox'}

matched = re.search(r'(?P<group1>\w+) (?P<group2>\w+) (?P<group9>xyz\w+)?', s)
print(matched.groupdict())
# 出力:{'group1': 'The', 'group2': 'quick', 'group9': None}
print(matched.groupdict('EMPTY'))
# 出力:{'group1': 'The', 'group2': 'quick', 'group9': 'EMPTY'}
import re

s = 'The quick brown fox jumps over the lazy dog.'
matched = re.search(r'(\w+) (?P<group2>\w+) (\w+) (?P<group4>\w+)', s)
print(matched.groups())
# 出力:('The', 'quick', 'brown', 'fox')

matched = re.search(r'(?P<group1>\w+) (?P<group2>\w+) (?P<group9>xyz\w+)?', s)
print(matched.groups())
# 出力:('The', 'quick', None)
print(matched.groups('EMPTY'))
# 出力:('The', 'quick', 'EMPTY')

Match.start【マッチ位置インデックス (先頭)】
Match.end【マッチ位置インデックス (末尾)】
Match.span【マッチ位置インデックス】

メモ

構文

Match.start([group])
Match.end([group])

戻り値先頭または末尾のマッチ位置インデックス
groupキャプチャ番号 または キャプチャ名
Match.span([group])

戻り値tuple【タプル型】 (先頭マッチ位置インデックス, 末尾マッチ位置インデックス)
groupキャプチャ番号 または キャプチャ名 (省略 / 0:マッチ部分全体)

import re

s = 'The quick brown fox jumps over the lazy dog.'
matched = re.search(r'\w*c\w*', s)
print(matched)
# 出力:<re.Match object; span=(4, 9), match='quick'>
print(matched.start())
# 出力:4
print(matched.end())
# 出力:9
print(matched.span())
# 出力:(4, 9)

matched = re.search(r'(\w+) (?P<group2>\w+) (\w+) (?P<group4>\w+)', s)
print(matched)
# 出力:<re.Match object; span=(0, 19), match='The quick brown fox'>
print(matched.start())
# 出力:0
print(matched.end())
# 出力:19
print(matched.span())
# 出力:(0, 19)

print(matched.start(1))
# 出力:0
print(matched.end(1))
# 出力:3
print(matched.span(1))
# 出力:(0, 3)

print(matched.start('group4'))
# 出力:16
print(matched.end('group4'))
# 出力:19
print(matched.span('group4'))
# 出力:(16, 19)