regex 什么能“?:“在Python正则表达式中是什么意思?

weylhg0b  于 2023-06-25  发布在  Python
关注(0)|答案(4)|浏览(139)

下面是Python正则表达式。?:是什么意思?表达式总体上做了什么?它如何匹配MAC地址,例如“00:07:32:12:ac:de:ef”?

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

2skhul331#

(?:...)表示一组非捕获分组括号。
通常,当你在正则表达式中写(...)时,它会“捕获”匹配的内容。当您使用非捕获版本时,它不会捕获。
在正则表达式匹配特定字符串之后,可以使用re包中的方法获得regex匹配的各个部分。
这个正则表达式如何匹配MAC地址“00:07:32:12:ac:de:ef”?
这和你最初问的问题不一样但是,regex部分是:

([\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对十六进制数字(字符串中总共有7对)。事实上,外部分组括号是多余的,如果省略,m.group(0)也可以工作(即使使用它们也可以工作)。如果你需要匹配7对,那么你把5变成6。如果你需要拒绝它们,那么你可以把锚放在正则表达式中:

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

插入符号^匹配字符串的开头;美元$匹配字符串的结尾。如果是5,则与示例字符串不匹配。用6代替5,它会匹配你的字符串。

uz75evzq

uz75evzq2#

像在(?:...)中那样使用?:会使组在替换期间不捕获。在寻找过程中,它没有任何意义。

您的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
)
"""

希望这能帮上忙。

ijnw1ujt

ijnw1ujt3#

它不会改变搜索过程。但它会影响找到匹配项后对组的检索。
例如:Text:text ='John Wick'
要查找的模式:regex = re. compile(r'John(?:\sWick)')#在这里我们正在寻找'John'和一个组(空格+Wick)。?:使此组不可检索。
当我们打印匹配时-没有任何变化:<re. match object; span =(0,9),match ='John Wick'>
但是如果您尝试使用(?:)语法:res = regex. finditer(text)for i in res:print(i)print(i.group(1))#这里我们尝试检索(?:\sWick)组
它给了我们一个错误:
IndexError:没有这样的组
另外,看:
Python文档:
(?:...)一个非捕获形式的普通括号。匹配括号内的任何正则表达式,但在执行匹配后无法检索组匹配的子字符串,也无法在模式中稍后引用。
链接到文档中的re页面:https://docs.python.org/3/library/re.html

34gzjxbg

34gzjxbg4#

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

相关问题