読者です 読者をやめる 読者になる 読者になる

あれもPython,これもPython

Pythonで世界を包みたい

Pythonで正規表現(re)を扱いたい(2)

正規表現(1)に続いてPython正規表現についてです。
ここではグループに関する正規表現を整理します。

groupとは

groupとは()で囲まれた正規表現のことを表します。
以下は一見すると結果を見ると同じに見えます。

import re
# グループを使ってない
re.match("aba","ababaaab").group()
# 'aba'

# グループを使っている
re.match("(ab)(a)","ababaaab").group()
# 'aba'

後者はabとaを()でそれぞれくくり、別のグループとしています。
このようにすると、.groups()でタプルに分割して返すことが可能になります。

また、.group(index)を用いると、それぞれにアクセスが可能になります。

import re
# グループを使っていない
re.match("aba","ababaaab").groups()
# ()

# グループを使っている
re.match("(ab)(a)","ababaaab").groups()
# ('ab','a')

re.match("(ab)(a)","ababaaab").group(2)
# 'a'

グループの拡張記法

グループは(?拡張記法+正規表現)とすることで
より高度な機能を使うことが出来ます。

名付け機能

# <名前>で名前を付けられる
re.match("(?<first>ab)(?<second>a)","ababaaab").group('second')
# 'a'

# groupdictで辞書にして取り出せる
re.match("(?<first>ab)(?<second>a)","ababaaab").groupgroup()
# {"first":"ab","second":"a"}

その他マッチの拡張

# = で先読みアサーション
re.match("ab(?=a)","ababaaab").group()
# 'ab':aはマッチの条件になるが、返り値には入らない

# <= で後読みアサーション
re.search("(?<=a)bab","ababaaab").group()
# 'bab':aはマッチの条件になるが、返り値には入らない

# <!で否定後読みアサーション
re.search("(?<\!a)bab","ababaaab").group()
# None