【发布时间】:2016-06-03 16:56:18
【问题描述】:
我找到了主题 Capturing group with findall?,但不幸的是它更基础,只涵盖不覆盖自身的组。
请看下面的例子:
S = "abcabc" # string used for all the cases below
1。 Findall - 没有组
print re.findall(r"abc", S) # ['abc', 'abc']
总体思路:这里没有组,所以我希望findall 返回所有匹配项的列表 - 请确认。
在这种情况下:Findall 正在寻找 abc,找到它,返回它,然后继续找到第二个。
2。 Findall - 一个明确的组
print re.findall(r"(abc)", S) # ['abc', 'abc']
总体思路:这里有一些群组,所以我希望findall 返回所有群组的列表 - 请确认。
在这种情况下:为什么只有一组结果却有两个结果?我是这样理解的:
findall正在寻找abc,找到了,
将其放在组内存缓冲区中,
返回,
findall开始再次寻找abc,以此类推...
这个推理正确吗?
3。 Findall - 覆盖组
print re.findall(r"(abc)+", S) # ['abc']
这看起来与上面类似,但只返回一个abc。我是这样理解的:
findall正在寻找abc,找到了,
将其放在组内存缓冲区中,
不返回它,因为 RE 本身需要继续,
找到另一个
abc,将其放入组内存缓冲区(覆盖之前的
abc),字符串结束,所以搜索也结束。
这个推理正确吗?我在这里非常具体,所以如果有任何问题(即使是微小的细节),请告诉我。
4。搜索 - 覆盖组
Search 扫描字符串以寻找单个匹配项,因此 re.search(r"(abc)", S) 和 re.search(r"(abc)", S) 显然只返回一个 abc,然后让我直接说:
re.search(r"(abc)+", S)
print m.group() # abcabc
print m.groups() # ('abc',)
a) 当然整场比赛是abcabc,但我们这里还有组,所以我可以得出结论,组与m.group() 无关(尽管有名称)?这就是为什么此方法不会覆盖任何内容?
事实上,括号的这种分组功能在这里是完全没有必要的——在这种情况下,我只想用括号来强调在不创建任何正则表达式组的情况下重复事物时需要放在一起的内容。
b) 谁能像我在项目符号 3 中所做的那样解释返回 abcabc(就缓冲区等而言)背后的机制?
【问题讨论】:
-
为什么不先完成上一题呢?您那里有 2 个答案,但您没有提供任何反馈。
-
我了解您有一些问题,没关系。但是在本网站的工作方式中,最好将每个问题分开,以便问题的答案可以是完整的,而不是部分的。正则表达式模块的文档中也涵盖了很多您所问的内容,并且很难准确理解您要问的问题,我建议您先做一些研究,也许您的问题已经有了答案,否则,请拆分您的提出问题,并为每个问题提供足够的信息以使其独立。您需要帮助的代码的最小工作示例。
-
@Wiktor,我的目的是先了解小组如何在 Python 中工作,然后再回到上一个主题,因为我必须承认您和其他人的答案对我来说并不完全清楚。我想知道在哪里提出我的问题,但最终决定最好将它们分开而不是使之前的主题太长。你的回答让我意识到我需要一些初步的知识来理解它,我在这里问了这个问题。如果它错了,我可以把它放在那里,但我无法想象它如何更具可读性......
-
@Inbar,我是这个网站的新手,所以每一个反馈都非常感谢 - 谢谢!但是,我不知道我怎么能把这么长的陈述放在前面的话题中。也许我只是错误地在这里提到了上一个主题,因为这两个主题是真正分开的。我将删除引用它的开头。
-
@Drizzt 你只需要意识到这是一个问答网站。不是论坛。提出问题,得到答案。但是你一次问很多问题,这对我们的格式不利。此外,您提出的问题并不是最适合本网站。我建议你先自己研究一下文档,以及如何使用这个网站,并提出问题,有一个很棒的 help center 和 How to Ask 指南。