指定桁数のぞろ目とマッチする正規表現

ちょっとしたネタですが、仕事で正規表現を扱う機会があり、その時にゾロ目とマッチするにはどう書けばいいんだろう?と疑問に思ったので試しました。

最大桁数のゾロ目とマッチする正規表現

まず、桁数を指定せず最大桁のマッチングを考えてみます。

これは 「1文字目とのマッチング+2文字目以降とのマッチング」 、の考え方で正規表現を組み立てることで実現できました。

結果として、(\d)\1+という表現でマッチングすることができました。

  1. 1文字目とのマッチング: (\d)
  2. 2文字目以降とのマッチング: \1+
    • \1は1でのマッチング結果
    • \1+で1でマッチした文字と同じ文字が続くかを検証する

Pythonでマッチングさせるコードは下記の様に書けます。 尚、マッチングした文字列全体はm.group(0)で取得できます。

例:1のゾロ目とのマッチング

import re

target = "111111112345"

# マッチする部分があるかチェックする
m = re.search(r"(\d)\1+", target)

# マッチした文字列全体
print(m.group(0))
# 11111111

指定した桁数のゾロ目とマッチする正規表現

次に、桁数を指定してマッチングできないかを考えてみます。

これは前節の「2文字目以降とのマッチング」を、 「2文字目以降の{桁数-1}文字のマッチング」 という考え方にすることで実現することができます。 表現としては(\d)\1{桁数-1}となります。

例:1の6桁のゾロ目(111111)とのマッチング

import re

target = "111111112345"

# マッチする部分があるかチェックする
m = re.search(r"(\d)\1{5}", target)

# マッチした文字列全体
print(m.group(0))
# 111111