"
它 (?:...)
表示一组非捕获分组括号。
通常,在正则表达式中写 (...)
时,它会'捕获'匹配的内容。当你使用非捕获版本时,它不会捕获。
在正则表达式与特定字符串匹配后,你可以通过 regex 中的方法来获取匹配的各个部分,这些方法在 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",因为这是字符串中的7对总共6对十六进制数字的第一组。实际上,外部分组括号是多余的,如果省略,
m.group(0)
也可以工作(即使有括号)。如果您需要匹配7对,则将5更改为6。如果您需要拒绝它们,则需要在正则表达式中添加锚点。
p = re.compile('^([\dA-Fa-f]{2}(?:[:-][\dA-Fa-f]{2}){5})$')
插入符号
^
匹配字符串的开头;美元符号
$
匹配字符串的结尾。使用数字5,它将无法匹配您的示例字符串。如果使用数字6代替5,它将能够匹配您的字符串。
?:
是可以的,那么(?:)
的目的是什么呢?只是为了提高效率吗?谢谢!另外,在re.compile()中的re模式应该用单引号(')或双引号(")括起来。 - Kai?:
,但是你需要重新编号你的捕获组 — 你多了一个捕获组。 - Jonathan Leffler