2011-01-24 18 views
1

次の正規表現が機能していないように見えているのがわかりません。最初の(python)regexの質問

私はこの仕事をするために他の正規表現を作ることができると知っていますが、これはうまくいくはずです。

re.search ("(\d*)", "prefix 1234 suffix").groups() 
('',) 

は興味深いことに、findAllのが動作しているようです:

re.findall("(\d*)", "prefix 1234 suffix") 
['', '', '', '', '', '', '', '1234', '', '', '', '', '', '', '', ''] 

それが動作する理由を私は理解しますが、私は、検索が動作しない理由としてはまだ混乱していますか?あなたが示している*+に変更することにより

re.findall("(\d+)", "prefix 1234 suffix") 

:私の理解では、その試合はこれを試してみてください文字列全体を一致させるためにそれを強制が、文字列

答えて

6

.searchは一度検索を実行し、最初に一致するためです。 \d*は文字がまったく一致しないため、最初にマッチするのは文字列の先頭にあり、最初のキャプチャグループは''です。あなたが尋ねたこととまったく同じことをしています。

あなたは少なくとも一つ桁と一致するように持っている、代わりに正規表現(\d+)をしていた場合、それが一致する可能性が最初の場所は1になり、それが1234をキャプチャします。

1

内のどこにでも数字を見つける必要がありを検索しなければならないですパターン\dは1回以上一致する必要があります。最初に使用していた*は、文字列内のすべての文字に一致する0回以上一致していました。

+0

私の混乱を明確にするために少し質問を追加しました。私はfindallがうまくいくことを理解していますが、なぜ検索がうまくいかないのだろうと思っていました。 – Hortitude

3

あなたの最初の例の戻り値は戻り値の最初の要素に対応しますfindall。正規表現としてr'(\d+)'を使用してください。

search文字列内のどこでも数字を見つけることができます。数字は0回以上見つかるように指示する正規表現です。それで、すべての文字の境界でゼロ桁が見つかります。

3

\d+ではなく\d*を使用してください。 \d*はゼロ以上を意味し、ゼロは文字列のオフセット0で得られるものです。