2012-03-22 11 views
3

私は、文字列があります。Pythonの正規表現パッシブグループと後方参照

# print thestring 
abcd\t$500\n 

を私はドル記号なしで500のドルの値を抽出したいです。ここで

は私のコードです:私はここで間違って

# trying positive lookbehind 
m = re.search('(<=\$)\d+$',thestring) 
# trying passive groups 
m = re.search('(?:\$)\d+$',thestring) 

何をしているのですか?

答えて

5

非キャプチャグループは、一致する部分文字列から結果を削除しないため、2番目の解決策が機能しませんでした。最初の解決策はうまくいくはずですが、肯定的な視点のための構文を誤って入力したようです。次のようになります。

(?<=\$)\d+$ 
+0

好奇心を持たずに、非キャプチャグループの目的は何ですか? – Abdulla

+2

@Abdulla非キャプチャグループ。コンテンツをまとめてグループ化しますが、結果は保存しません。キャプチャグループよりも高速です。このグループのコンテンツを再利用する必要がある場合のみ、キャプチャグループを使用してください。 – stema

+0

グループ化が必要な方法で正規表現を変更する必要があるが、既存のグループの番号付けに影響を与えたくない場合にも便利です。 – VeeArr

3

まず第一に、あなたはあなたのバックスラッシュをエスケープするか、生の文字列を使用する必要があり、次のいずれか

'(<=\\$)\\d+$' 

または

r'(<=\$)\d+$' 

次に、なぜ後読みまたはパッシブグループを使うのか?あなたは番号を捕まえたい、そう?方法:

m = re.search('\\$(\\d+)',thestring) 

m.group(1)を使用して番号を取得します。

+0

なぜ2つのバックスラッシュが必要ですか?それは1つでうまくいくようです。申し訳ありませんが、私は正規表現にはとても新しいです。 – Abdulla

+1

幸いなことに、 '\ $'も '\ d'も有効なエスケープシーケンスではないからです。しかし、入力した場合、 '\ n'と言うと、スラッシュと 'n'の代わりに改行文字が1つだけ得られます。 - インタラクティブなPythonシェルで、エスケープされていない文字列の1つを評価します。通訳者はそれをエスケープ形式で返します。 –

+2

'\ n'は実際には問題にはなりません。エスケープシーケンスがPython改行文字に変換されるからです。 '\ b'は良い例です - 正規表現としては"単語境界 "を意味し、文字列では"バックスペース "を意味します。 –