0

次の正規表現を作成しようとしています。-XXまたはXX:XX、最大6回の繰り返し(XX:XX:XX:XX:XX:XX)。ここで、Xは16進数です。

つまり、1〜6バイトの範囲のMACアドレスをキャプチャしようとしています。

regex = re.compile("^([0-9a-fA-F]{2})(?:(?:\:([0-9a-fA-F]{2})){0,5})$")

問題は、たとえば「11:22:33」と入力すると、最初の一致と最後の一致のみがキャプチャされ、結果が["11"、"22"]になることです。

質問:{0,5}文字で、最後の繰り返しではなく、すべての繰り返しをキャッチできる方法はありますか?ありがとう!

4

1 に答える 1

3

Python ではありません。ただし、最初に正規表現で正しい形式を確認してから、次の場所で文字列を単純に分割できます:

result = s.split(':')

また、正規表現は常に生の文字列として記述する必要があることに注意してください (そうしないと、エスケープで問題が発生します)。そして、あなたの外側の非キャプチャグループは何もしません。


技術的には、正規表現のみでそれを行う方法がありますが、正規表現は非常に恐ろしいものです:

r"^([0-9a-fA-F]{2})(?:([0-9a-fA-F]{2}))?(?:([0-9a-fA-F]{2}))?(?:([0-9a-fA-F]{2}))?(?:([0-9a-fA-F]{2}))?(?:([0-9a-fA-F]{2}))?$"

ただし、ここでは常に 6 つのキャプチャが取得されますが、一部が空になる可能性があります。

于 2012-12-15T20:38:27.010 に答える