我使用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
返回匹配的字符串?我的正则表达式出了什么问题?
答案 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)))