我使用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)))