2

私はpythonが初めてです。Python でのこれらのプログラムの動作を理解できませんでした。

import re
sub="dear"
pat="[aeiou]+"
m=re.search(pat,sub)
print(m.group())

これは「ea」を出力します

import re
sub="dear"
pat="[aeiou]*"
m=re.search(pat,sub)
print(m.group())

これは何も印刷しません。

+ は 1 回以上の出現に一致し、* は 0 回以上の出現に一致します。両方のプログラムで「ea」を出力することを期待していますが、そうではありません。

なぜこれが起こるのですか?

4

3 に答える 3

9

これは何も印刷しません。

ではない正確に。もちろん、目に見えないので気付かなかった空の文字列を出力します。代わりに次のコードを使用してみてください。

l = re.findall(pat, sub)
print l

これは印刷されます:

['', 'ea', '', '']

なぜこの振る舞いをするのですか?

これは、*quantifier -を使用する[aeiou]*と、この正規表現パターンは、一致しないすべての文字列の前の空の文字列と最後の空の文字列にも一致するためです。したがって、 stringdearの場合、次のように一致します。

*d*ea*r*  // * where the pattern matches.

すべての*'sマッチの位置を示します。

  • d柄に合わない。したがって、 match はその前の空の文字列です。
  • eaパターンに一致します。ということで、次の試合はea.
  • r柄に合わない。したがって、一致は の前の空の文字列rです。
  • 最後の空文字列は、 の後の空文字列rです。
于 2013-09-24T16:45:44.313 に答える
3

を使用[aeiou]*して、最初にパターン マッチを行います。次を使用して確認できますMatchObject.start

>>> import re
>>> sub="dear"
>>> pat="[aeiou]*"
>>> m=re.search(pat,sub)
>>> m.start()
0
>>> m.end()
0
>>> m.group()
''
于 2013-09-24T16:45:01.447 に答える
1

+その前の文字またはグループの少なくとも 1 つに一致します。したがって、、、、、または(母音)の[aeiou]+少なくとも 1 つに一致しaます。eiou

正規表現は、探している最小の 1 つの母音を見つけるために文字列内のあらゆる場所を検索し、期待どおりに動作します (条件が満たされるように執拗に試みます)。

*ただし、少なくとも 0 を意味します。これは、何にも一致しないことも意味します。つまり、正規表現エンジンがテスト対象の文字列の先頭で一致を探し始めると、一致が見つからないため、0一致条件が満たされ、これが得られる結果になります。

string を使用した場合は、一致earすることに注意してください。ea

于 2013-09-24T16:46:27.353 に答える