8

以下はPythonの正規表現です。その?:意味は何ですか?表現は全体的に何をしますか?「」などのMACアドレスとどのように一致し00:07:32:12:ac:de:efますか?

re.compile(([\dA-Fa-f]{2}(?:[:-][\dA-Fa-f]{2}){5}), string)  
4

3 に答える 3

11

これ(?:...)は、キャプチャされないグループ化括弧のセットを意味します。

通常、(...)正規表現を書き込むと、一致したマテリアルが「キャプチャ」されます。非キャプチャバージョンを使用すると、キャプチャされません。

正規表現が特定の文字列と一致した後、パッケージ内のメソッドを使用して、正規表現と一致するさまざまな部分を取得できます。re


この正規表現は、MACアドレス「00:07:32:12:ac:de:ef」とどのように一致しますか?

それはあなたが最初に尋ねたものとは異なる質問です。ただし、正規表現の部分は次のとおりです。

([\dA-Fa-f]{2}(?:[:-][\dA-Fa-f]{2}){5})

最も外側の括弧のペアは、括弧をキャプチャしています。文字列に対して正規表現を正常に使用すると、それらが囲むものが利用可能になります。

[\dA-Fa-f]{2}パーツは、ペアで数字()または\d16進数に一致し、その後に、一致するマテリアルがコロンまたはダッシュ(または)である非キャプチャグループが続き、その後に別の16進数のペアが続き、全体が正確に5回繰り返されます。回数。A-Fa-f]{2}:-

p = re.compile(([\dA-Fa-f]{2}(?:[:-][\dA-Fa-f]{2}){5}))
m = p.match("00:07:32:12:ac:de:ef")
if m:
    m.group(1)

最後の行は、文字列「00:07:32:12:ac:de」を出力する必要があります。これは、6組の16進数の最初のセットであるためです(文字列の合計7組のうち)。実際、外側のグループ化括弧は冗長であり、省略した場合m.group(0)は機能します(それらでも機能します)。7ペアを一致させる必要がある場合は、5を6に変更します。それらを拒否する必要がある場合は、正規表現にアンカーを配置します。

p = re.compile(^([\dA-Fa-f]{2}(?:[:-][\dA-Fa-f]{2}){5})$)

カレット^は文字列の先頭と一致します。ドル$は文字列の終わりと一致します。5を使用すると、サンプル文字列と一致しません。5の代わりに6を使用すると、文字列と一致します。

于 2012-05-29T05:31:36.083 に答える
6

?:as inを使用すると(?:...)、置換中にグループがキャプチャされなくなります。検索中は意味がありません。

あなたの正規表現は

r"""
(                   # Match the regular expression below and capture its match into backreference number 1
   [\dA-Fa-f]          # Match a single character present in the list below
                          # A single digit 0..9
                          # A character in the range between “A” and “F”
                          # A character in the range between “a” and “f”
      {2}                 # Exactly 2 times
   (?:                 # Match the regular expression below
      [:-]                # Match a single character present in the list below
                             # The character “:”
                             # The character “-”
      [\dA-Fa-f]          # Match a single character present in the list below
                             # A single digit 0..9
                             # A character in the range between “A” and “F”
                             # A character in the range between “a” and “f”
         {2}                 # Exactly 2 times
   ){5}                # Exactly 5 times
)
"""

お役に立てれば。

于 2012-05-29T05:30:57.597 に答える
0

(?:...)非catureグループを意味します。グループはキャプチャされません。

于 2012-05-29T05:32:04.497 に答える