正则表达式 - 非捕获组返回所谓的非捕获组,,? [复制]

Posted

技术标签:

【中文标题】正则表达式 - 非捕获组返回所谓的非捕获组,,? [复制]【英文标题】:regex - non-capturing group returns the supposedly non-captured group,,? [duplicate] 【发布时间】:2018-12-04 00:09:29 【问题描述】:

这不是重复的……在我看来。我不是在问它的用处。如果可以的话,我要求澄清定义。不要投反对票,请解释一下。如果我认为其他读者愚蠢,我会删除这篇文章。

f=re.match(pattern, str)
pattern= '(?:animal)(?:=)((\w+),)+'
str = 'animal=cat,dog,cat,tiger,dog\nanimal=cat,cat,dog,dog,tiger\nanimal=dog,dog,cat,cat,tiger'

这样显示

animal=cat,dog,cat,tiger,dog
animal=cat,cat,dog,dog,tiger
animal=dog,dog,cat,cat,tiger

如果 ?: 之后的内容应该是 ' 正则括号的非捕获版本。匹配括号内的任何正则表达式,但组匹配的子字符串在执行匹配后无法检索或稍后在模式中引用。'

为什么它仍然返回字符串 'animal='?

(Python 3.6.3) f 是:

<_sre.SRE_Match object; span=(0, 25), match='animal=cat,dog,cat,tiger,'>
f[0]
'animal=cat,dog,cat,tiger,'
f[1]
'tiger,'
f[2]
'tiger'

【问题讨论】:

你在困惑什么?你期待什么结果? 本质上,非捕获组会寻找某种模式,但实际上并不将其包含在匹配中。 那为什么是彩色的呢?如果要排除某个术语/短语..还有其他功能可以使用,例如负前瞻 蓝色是匹配的,regex101 上的任何其他颜色都是捕获组。 '但组匹配的子字符串在执行匹配后无法检索或在模式中稍后引用。'意思..所以我尝试用该命令替换re.match(str, pattern)中的pattern,它返回错误为invalid syntax.. 【参考方案1】:

(foo) 是一个捕获组。 (?:foo) 是一个非捕获组。 (?&lt;foo&gt;bar) 是一个命名的捕获组,其中名称是“foo”。

捕获组的特点是以后可以通过引用捕获组编号来引用它们,或者如果它被命名,则可以引用组的名称。当您尝试将匹配分成块时,它很有帮助。

【讨论】:

哦(除了你给出的标记示例)比如 \1 \2 是指最近的比赛?但是……实际上,彩色匹配并没有任何意义……? 我的错...你是对的。 \1 匹配第 1 组,但在使用替换时,您需要使用 $1 来引用第 1 组。这些事情可能会让人感到困惑。 Here is an example of how capture groups could be useful【参考方案2】:

当匹配正则表达式时,括号 () 中的任何内容都被视为一个组。第 0 组是整个匹配的字符串,而第 1 组,... 是常规模式中由 () 标识的子组。

import re
rr = '(?:animal)(?:=)((\w+),)+'
mystr="animal=cat,dog,cat,tiger,dog"
res = re.search(rr,mystr)
res.group(0)
res.group(1)

使用https://pythex.org/,您还可以针对组进行测试

【讨论】:

以上是关于正则表达式 - 非捕获组返回所谓的非捕获组,,? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

什么是正则表达式“独立非捕获组”?

非捕获组不在正则表达式中工作

为啥正则表达式可选非捕获组不作为可选并且搞砸匹配?

正则表达式 1. 分组提取/非捕获组

具有多个捕获组的 R 中的正则表达式组捕获

非捕获组仍然显示在比赛中