2012-02-26 11 views
4

私はテキストに一致する必要があります。Pythonは正規表現を再利用

Ejと:

-?\d{1,3}(\.\d{1,2})? 

どのように私はそれを再利用することができます。yのx後の値、またはzがマッチした値を受け入れる

text = 'C:x=-10.25:y=340.1:z=1;' 

これらは変数である唯一の値です。他のすべての文字は固定する必要があります。つまり、彼らはその正確な順序でなければなりません。

これを表現する方法は短くありますか?

r'^C:x=-?\d{1,3}(.\d{1,2})?:y=-?\d{1,3}(.\d{1,2})?:z=-?\d{1,3}(.\d{1,2})?;$' 

答えて

8

人々は時々

label_value = r'\w=-?\d{1,3}(\.\d{1,2})?' 
line = r'^C:{0}:{0}:{0};$'.format(label_value) 
line_pat= re.compile(line) 

これは少し賢くているこの種のものを行います。

label_value = r'(\w)=(-?\d{1,3}(?:\.\d{1,2})?)' 
line = r'^C:{0}:{0}:{0};$'.format(label_value) 
line_pat= re.compile(line) 

なぜですか?小数点以下の桁だけでなく、ラベルと浮動小数点値全体を収集します。

実際には、ラベルの順序が実際にの場合はとなります。

value = r'(-?\d{1,3}(?:\.\d{1,2})?)' 
line = r'^C:x={0}:y={0}:z={0};$'.format(value) 
line_pat= re.compile(line) 

これには、指定された順序で3つのラベルが必要です。変化する可能性のあるものの1つ。

+0

正確な順序で 'x'、' y'、 'z'を望んでいたので、' \ w = 'label_value'の外に移動すると思います。そうでなければ、素晴らしい。 –

+1

@TimPietzcker:これは難しい電話です。誰かが「正確にその注文」と言うとき、私は「典型的にはその注文」と聞きます。私はその種のものが長い間固定されているのを見たことはありません。しかし、これは例外である可能性があります。実際にはデータが無効であると扱われる理由は順序の乱れである可能性があります。 –

0

私が書いた正規表現にはバグがあったので、私はそれを削除しました。

私は新しい正規表現を開発したりテストしたりする必要があるときはいつも、あなたはあなたの正規表現の結果をリアルタイムで見ることを可能にするオンラインツールで遊びます。

特に私は、一般的にこれは何の偽陰性を返しませんが、偽陽性の数が少ないでしょう。この1

0

を使用PYTHONないが:

'^C(:[xyz]=-?\d{1,3}(.\d{1,2})?){3}' 

偽陽性とは、x、y、zが間違った組み合わせ(すなわちy:x:z、x:x:zなど)で発生する場合です。