2016-09-09 9 views
0

私はこのような文字列を検索しre.matchを使用します。re.match/re.searchは動作しますが、re.findallが機能しないのはなぜですか?

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は一致する文字列を返さないのですか?私の正規表現に何が問題なのですか? help(re.findall)から

答えて

0

戻り、文字列内のすべての重複しないマッチのリスト。

パターン内に1つ以上のキャプチャグループが存在する場合は、 グループのリストを返します。パターンが よりも1つのグループより多い場合、これはタプルのリストになります。

空のマッチが結果に含まれます。

括弧でくくられたビット(\s)はキャプチャグループであるため、re.findallはキャプチャのリストを返します。そこには’のキャプチャグループが1つしかないので、リストの各項目はタプルではなく単なる文字列です。

?:、つまり(?:\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))) 
関連する問題