为什么re.match / re.search有效,但re.findall不起作用?

时间:2016-09-09 02:54:55

标签: python regex

我使用re.match来找到这样的字符串:

print(re.match('''#include(\s)?".*"''', '''#include "my.h"'''))

然后我得到了这样的结果:

<_sre.SRE_Match object; span=(0, 15), match='#include "my.h"'>

然后我替换匹配函数:

print(re.findall('''#include(\s)?".*"''', '''#include "my.h"'''))

结果是:

[' ']

我很困惑,为什么选择re.findall返回匹配的字符串?我的正则表达式出了什么问题?

1 个答案:

答案 0 :(得分:1)

来自help(re.findall)

  

返回字符串中所有非重叠匹配的列表。

     

如果模式中存在一个或多个捕获组,则返回a   小组名单;如果模式有更多,这将是一个元组列表   而不是一个小组。

     

结果中包含空匹配。

您的括号位(\s)是一个捕获组,因此re.findall会返回捕获列表。只有一个捕获组,因此列表中的每个项目只是一个字符串,而不是一个元组。

您可以使用?:(即(?:\s)?)使群组无法捕捉。不过,那在那一点上并不是很有用,因为它等同于\s?。为了更灵活 - 例如如果你需要捕获多个部分 - re.finditer可能是最好的方法:

for m in re.finditer(r'#include\s*"(.*?)"', '#include "my.h"'):
    print('Included %s using %s' % (m.group(1), m.group(0)))