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}部分匹配一个数字 ( \d) 或一对十六进制数字A-Fa-f]{2}后跟一个非捕获分组,其中匹配的材料是冒号或破折号 (:-),后跟另一对十六进制数字,整个重复正好 5次。

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 对十六进制数字(在字符串中总共七对中)。事实上,外部分组括号是多余的,如果省略,m.group(0)也可以使用(即使使用它们也可以)。如果需要匹配 7 对,则将 5 更改为 6。如果需要拒绝它们,则将锚点放入正则表达式中:

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

插入符^匹配字符串的开头;美元$匹配字符串的结尾。使用 5,这与您的示例字符串不匹配。用 6 代替 5,它将与您的字符串匹配。

于 2012-05-29T05:31:36.083 回答
6

使用?:as in(?:...)使组在替换期间不被捕获。在查找期间它没有任何意义。

您的 RegEx 意味着

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

(?:...)表示非自然组。该组将不会被捕获。

于 2012-05-29T05:32:04.497 回答