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



我使用re.match查找字符串,如下所示:

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

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

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

然后我替换match函数:

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

的结果是:

[' ']

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

From help(re.findall):

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

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

空匹配项包含在结果中。

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

您可以使用?:(即(?:s)?)使组非捕获。不过,这在此时并不是很有用,因为它只相当于s?。为了获得更大的灵活性–例如,如果您需要捕获多个部分& & &;re.finditer可能是最好的方法:

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

最新更新