たとえば次のようなファイル名のテキストがあるとする。
file_name-10.txt
file_name-1.txt
ファイル名本体の末尾にある番号を2桁に統一したいようなとき、1つ目にはマッチせず、2つ目にはマッチさせたい。
この場合、以下のような正規表現でマッチングできる。
1 2 3 4 5 6 7 8 9 10 11 12 |
str1 = 'file_name-10.txt' str2 = 'file_name-1.txt' pattern = re.compile(r'-\d\.') match = re.search(pattern, str1) print(match) match = re.search(pattern, str2) print(match) # None # <re.Match object; span=(9, 12), match='-1.'> |
ただしこれだけでは、該当するファイル名はわかるが、0の挿入といった部分的な操作ができない。
そのような場合は、正規表現を()
で区切り、group()
メソッドで部分列を取り出すことができる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
pattern = re.compile(r'(\w+-)(\d\.\w+)') match = re.search(pattern, str1) print(match) match = re.search(pattern, str2) print(match) print(match.group(0)) print(match.group(1)) print(match.group(2)) print(match.group(1) + '0' + match.group(2)) # None # <re.Match object; span=(0, 15), match='file_name-1.txt'> # file_name-1.txt # file_name- # 1.txt # file_name-01.txt |
パターン設定で()
で区切った部分ごとにグルーピングされ、その各部分を後から再利用できる。なお、group(0)
はマッチした部分全体になる。