Python - 奇怪的正则表达式与组上的+ / *匹配

时间:2017-04-27 10:20:58

标签: python regex

>>> src = '  pkg.subpkg.submod.thing  pkg2.subpkg.submod.thing  '
>>> re.search(r'\s*(\w+\.)+', src).groups()
('submod.',)

这个正则表达式似乎把所有不是空间的东西放到了一个/组中 - 在正则表达式匹配之前没有什么可以丢失。

为什么只有最后" +"在这里的小组中找到了重复 - 而不是('pkg.subpkg.submod.',)

('pkg.',) - 提前停止,因为没有真正的重复 - 没有"信息丢失"在另一种意义上?

(我需要使用其他(?:...),例如r'\s((?:\w+\.)+)'

更奇怪的是:

>>> src = '  pkg.subpkg.submod.thing  pkg2.subpkg.submod.thing  '
>>> re.search(r'\s(\w+\.)*', src).groups()
(None,)

编辑:"更奇怪"实际上"不那么奇怪"正如@Avinash Raj指出的那样,因为 - 与预期不同 - 比赛只是在小组之前结束;所以

>>> re.search(r'\s+(\w+\.)*', '  pkg.subpkg.submod.thing').groups()
('submod.',)

..然后产生与#34; +"相同的质疑行为。 :最后一次重复 - 看似丢失之前的事情......

3 个答案:

答案 0 :(得分:1)

我会解释更奇怪的部分..

src = '  pkg.subpkg.submod.thing  pkg2.subpkg.submod.thing  '
找到第一个匹配后,

re.search会停止匹配。所以,

r'\s(\w+\.)*'会匹配第一个空格字符( *重复前一个模式零次或多次),因为(\w+\.)*之后没有匹配searchObj上的第一个空格groups()函数返回None,而searchObj上的group应该返回第一个空格的空格。

答案 1 :(得分:0)

我不知道,为什么对你来说很奇怪。你期待什么?

在文档中,您可以找到以下内容:

re.search(pattern,string,flags = 0) 扫描字符串,查找正则表达式模式的第一个位置......

re.search(r'\s*(\w+\.)+', src).groups()

在您的搜索字符串中,您只有一个组:(\ w +。) 因为默认情况下它是贪婪的,所以 pkg.subpkg。会在找到 submod。之前被吃掉,这是填充的最后一个,字符串匹配。

你的第二次尝试不匹配,因为甚至没有一个小组有必要履行声明,所以所有3个部分都被吃掉了,在集团内部你什么都没找到。

你正在寻找这个吗?

re.search(r'\s*((\w+\.)+)', src).groups()[0]

尝试以下内容以更好地理解它:

re.search(r'\s*((\w+\.)*)(\w+\.)*', 'a.b.c.d.e.f.g.h.i').groups()

答案 2 :(得分:-1)

这应该可以正常匹配完整的字符串'pkg.subpkg.submod.thing pkg2.subpkg.submod.thing'

(\s*(\w+[.\s])+)+

如果您想要输出'pkg.subpkg.submod.thing',请使用此

\s*(\w+[.\s])+