作者: Ueta Masayuki
日時: 2004/1/4(21:10)
うえたです。

non-greedy(非欲張り型、非強欲型)のパターンマッ
チにあまり慣れていなくて、次の結果に出合って戸惑
っています。

まず、末尾を指定する$がないときは、()の最少一致
ですから、一致が2回おこり、'(test)', '(quiz)'に一致
しています。これは予想どおり。

つぎに、位置指定子$を付けると、最後にある'(quiz)'
だけに一致すると思っていたところ、実際には'(test).
This is a (quiz)'に一致しまいました。

$を付けると、どうして最後にある(quiz)だけにマッチし
ないで、(test)以降(quiz)までにマッチするのでしょう
か。

>>> import re
>>> str = 'That is a (test).  This is a (quiz)'
>>> m = re.findall(r'\(.+?\)', str)
>>> print m
['(test)', '(quiz)']
>>> n = re.findall(r'\(.+?\)$', str)
>>> print n
['(test).  This is a (quiz)']
>>> 

$を付けたとき、上のような結果になることを、どのように
理解すればいいのか、どなたか解説していただけませ
んか。『詳説正規表現』は手元にあります。参考になる
箇所でも、結構です。

なお、Perlでも同じことをやってみました。結果は同じで
す。

$str = 'That is a (test). This is a (quiz)';

@m = $str =~ /(\(.+?\))/g;
print @m,"\n";
print scalar @m,"\n";

@n = $str =~ /(\(.+?\))$/g;
print @n,"\n";
print scalar @n,"\n";