【问题标题】:Python Regular Expression GroupsPython 正则表达式组
【发布时间】:2016-07-06 03:48:58
【问题描述】:

为什么这个正则表达式会打印('c',)()? 我以为"([abc])+" === "([abc])([abc])([abc])..."

>>> import re
>>> m = re.match("([abc])+", "abc")
>>> print m.groups()
('c',)
>>> m.groups(0)
('c',)
>>> m = re.match("[abc]+", "abc")
>>> m.groups()
()
>>> m.groups(0)
()

【问题讨论】:

  • m.group()='abc'(是 m.group 而不是 m.groups)

标签: python regex python-2.7


【解决方案1】:

来自关于 groups

的文档

返回一个元组,其中包含匹配的所有子组,从 1 到模式中有多少组。默认参数用于未参加比赛的组;它默认为无。

在第一个正则表达式 ([abc])+ 中,它匹配字符 abc 但只会存储最后一个匹配项

([abc])+
<----->
Matches a or b or c
Observe carefully. Capturing groups are surrounding only the character class
So, only one character from the matched character class can be stored in capturing group.

如果您想在捕获组中捕获字符串abc,请使用

([abc]+)

上面会找到由abc组成的字符串并将其存储在捕获组中。

在第二个正则表达式[abc]+ 中,没有捕获组,因此显示空结果。

【讨论】:

  • "([abc])([abc])([abc])" 将存储所有三个匹配项,而([abc])+ 将仅存储最后一个匹配项。多么奇怪!
  • @J.Joe 没什么奇怪的..第一个很明显..我已经更新了答案,解释了发生了什么..看看它是否有帮助..你可以问你是否还有问题
  • @J.Joe ([abc])([abc])([abc]) 将每个匹配项存储在不同的捕获组中..但是(abc)+ 每次都会被覆盖..所以您只有一个匹配项存储在捕获组中
  • 这意味着正则表达式看到([abc])+并将其扩展为[abc]*([abc])?
  • rock321987 你摇滚! A repeated capturing group will only capture the last iteration. 知道了。
【解决方案2】:

当你在括号后面加上加号时,你一次匹配一个字符,很多次。所以它匹配 a 然后 b 然后 c,每次覆盖前一个。将 + 移到 ([abc]+) 内以匹配一个或多个。

【讨论】:

    猜你喜欢
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2011-08-06
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多