2011-07-13 7 views
2

を使用してPythonの正規表現の繰り返しを実行すると、検出された繰り返しの数に基づいて可変数のキャプチャブロックをキャプチャできますか?たとえば、次の検索文字列では、同じ正規表現ですべての数字文字列を取得したいと考えています。 (キャプチャしようとしている:89、45):python3の正規表現機能を使用して、キャプチャの質問

検索文字列1(捕獲しようとしている:98、67、89、45):

zzz89zzz45.mp3 

検索文字列2

zzz98zzz67zzz89zzz45.mp3 

検索文字列3(キャプチャしよう:98、67、89、45、55、111):すべての値があるけれども

zzz98zzz67zzz89zzz45vdvd55lplp111.mp3 

次の正規表現は、すべての繰り返しに一致します)(

((\d+)\D*)*\.mp3$ 

他の2つのオプションは、すべての場合に異なる正規表現を作成している、または使用のfindAll:後で使用するためには使用できません(1つだけ数字列が取り込まれます)。上記の正規表現を調整して、後で正規表現機能を使用してさまざまな繰り返し数で使用するためにすべての数字文字列を取得するか、python3でこれを行うにはfindall()を使用する必要がありますか?

+0

findallの何が問題なのですか? –

+0

findallで何も間違っていない、私は今自分のコードで使用しています。私は正規表現をよりよく理解しようとしています。 –

答えて

3

ほとんどまたは全ての正規表現エンジン、(Pythonのような)PCRE構文に基づいて、それらの特定を含め、応じて自分のキャプチャグループにラベルを付けます開始括弧の数値インデックスには、正規表現としてと書かれています。したがって、キャプチャグループだけでは、文字列から任意の可変数の部分列を抽出することはできません。

s = ... 
res = re.match(r'\D*' + 25 * r'(\d+)\D+') 
numbers = [r for r in res.groups() if r is not None] 

これは、数字の25グループまであなたを取得します:

あなたは(私の知る限り)取得することができ、最も近いが、手動でキャプチャグループの特定の数、このような何かを書くことです。さらに必要な場合は、25をいくつか高い数字に置き換えてください。

findall()の反復アプローチよりも効率が悪い場合は、私はそれをテストしていませんが、驚くことはありません。

+0

それは私が探していたものです。私はpythonをpythonとみなしていましたが、findall()は必要ない場合は使用できませんでしたが、私は確信していました。 –

+0

"私たちがそれを必要としなかったなら、findall()は利用できませんでした" ...まぁ?いずれにせよ、それが価値あるものであれば、私は自分自身でこれをやっていたなら、 'findall()'を使うことになるでしょう。 –

+0

私はhttp://wiki.pythonを考えていました。org/moin/TOOWTDI –

3

これは、ドットの前にすべての数字と一致します:一般的に使用されている

s = "zzz98zzz67zzz89zzz45vdvd55lplp111.mp3" 
res = re.findall("[0-9]+(?=.*\\.)", s) 
print(res) 
+0

、findall()を使用しています。 Python3があなたに与える余分な関数ではなく、正規表現を使って行うことができるかどうかを知りたいと思います。 –

+0

これはregexを使用しています - findallのパラメータは正規表現ですね。 –

+0

私のコードでは、私はストリップ.mp3し、findall( '\ d +')します。 '\ d +'は正規表現ですが、python3でfindall()のようなものを使用して "裸の"正規表現でこれを行うことができるかどうかに興味があります。私はこれが正規表現が扱うことができる種類の問題か、この状況でfindall()のようなものが必要かどうかに興味があります。ありがとう。 –