【发布时间】:2021-11-21 23:14:26
【问题描述】:
我正在研究一个 CS50 问题,您必须找到连续重复的字符串模式(DNA 序列中的核苷酸)。我想我会使用re,因为它是 Python3 分配的,我之前已经对其进行了一些修改,并认为我可以解决它......但是不。
所以我搜索了如何实现这一点,并找到了一个用户建议使用 re.findall("(?:<pattern>)+", <string>) 的主题,而这正是我解决问题所需要的。
所以我对 ?: 表达式感到好奇并查阅了文档,但无法理解 non-capturing group 的含义,并且当我找到使用字符串的解释时,我不得不再次四处寻找答案由一个网址组成。
在这个特定示例中,用户使用的是re.match:
"(?:https?|ftp)://(stackoverflow.com)"
output:
group1: (stackoverflow.com)
vs
"(https?|ftp)://(stackoverflow.com)"
output:
group1: (https)
group2: (stackoverflow.com)
此时我明白了非捕获意味着什么......但现在我不明白为什么?: 对re.match 和re.findall 的行为不同,其中匹配对象,如官方文档中所述,确实如此re.findall 方法返回的列表似乎捕获了匹配的子字符串并将连续重复分组为一个,而不捕获指示的组。
我最好的猜测是,由于它是非捕获的,因此该方法会继续连续查找匹配的子字符串,一旦结束,它就会“关闭”组,这就是为什么重复的子字符串被分组为一个的原因。但我仍然不知道为什么 re.findall 返回不应该被捕获的内容,如果有人能指出我正确的方向,我真的很感激。
【问题讨论】:
-
developers.google.com/edu/python/regular-expressions — 无论如何,使用最小的 SSCCE 会更清楚地说明问题的行为,并输出所有相关示例。 (关于“关闭小组”的说法听起来不准确。)
标签: python-3.x regex regex-greedy