>>> 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; +"相同的质疑行为。 :最后一次重复 - 看似丢失之前的事情......
答案 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])+