>>> src = ' pkg.subpkg.submod.thing pkg2.subpkg.submod.thing '
>>> re.search(r'\s*(\w+\.)+', src).groups()
('submod.',)这个正则表达式似乎把所有不是空间的东西放到了一个/组中--在regex比赛停止之前没有什么损失。
为什么这里的组中只有最后一次 "+“重复-而不是('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所指出的,“更奇怪”实际上“不那么奇怪”,因为--不像预期的--比赛只是在组前结束;所以
>>> re.search(r'\s+(\w+\.)*', ' pkg.subpkg.submod.thing').groups()
('submod.',)。。然后产生与"+“相同的被质疑的行为:最后一次重复--在看起来迷失之前.
发布于 2017-04-27 10:29:35
我会解释更奇怪的部分..。
src = ' pkg.subpkg.submod.thing pkg2.subpkg.submod.thing '一旦找到第一个匹配项,re.search就停止匹配。所以,
r'\s(\w+\.)*'将匹配第一个空格字符(*重复前一个模式0次或多次),因为在第一个空格之后没有匹配的(\w+\.)*,searchObj上的groups()函数返回None,searchObj上的group应该返回作为第一个空格的空间。
发布于 2017-04-27 10:42:41
我不知道,为什么这对你来说很奇怪。你能指望什么?
在文档中可以找到以下内容:
re.search( pattern,string,flags=0)通过字符串扫描寻找正则表达式模式的第一个位置。
re.search(r'\s*(\w+\.)+', src).groups()在搜索字符串中,只有一个组:(\w+.),因为默认情况下,它是贪婪的,所有pkg.subpkg.都是在找到submod.之前吃掉的,这是最后一个被填充的字符串匹配。
你的第二次尝试不匹配,因为甚至没有一个必要的小组来完成这个声明,所以所有的三个部分都被吃掉了,而在组内你什么也找不到。
你在找这个吗?
re.search(r'\s*((\w+\.)+)', src).groups()[0]为了更好地理解它,请尝试以下几点:
re.search(r'\s*((\w+\.)*)(\w+\.)*', 'a.b.c.d.e.f.g.h.i').groups()发布于 2017-04-27 10:27:18
这应该可以很好地匹配完整的字符串“pkg.subpkg.submod.thing pkg2.subpkg.submod.thing”。
(\s*(\w+[.\s])+)+如果您希望输出‘pkg.subpkg.submod.thing’,那么请使用以下命令
\s*(\w+[.\s])+https://stackoverflow.com/questions/43655005
复制相似问题