2009-05-30 9 views
0

これは正しい単語なのかどうかわかりませんが、数学的表現から係数と指数を抽出できる正規表現を考え出しています。式は 'axB + cxD + exF'という形式で表示されます。ここで、小文字は係数で、大文字は指数です。私はそれらの両方に一致する正規表現を持っていますが、私は2つの正規表現を使用することができますか、私は係数と一致するために1つと指数のために1つを疑問に思っています。手紙にマッチすることなく数字をその片面の手紙と一致させる方法はありますか? EG、 '3x3 + 6x2 + 2x1 + 8x0'で取得する必要があります ['3'、 '6'、 '2'、 '8'] と ['3'、 '2'、 '1' '0']Pythonの正規表現 - 条件付き一致?

+0

はあなたが必要としないでください(+ - )? –

+0

私は係数に符号を追加しました。+がある場合は無視し、その隣の係数は正のままです。 〜がある場合、\ dの直前に - を追加するだけでそれを拾いますが、うまくいきます。 –

答えて

5

positive look-aheadを使用して、他のものと一致するものを指定することができます。係数を一致させるには、使用することができます:

>>> s = '3x3+6x2+2x1+8x0' 
>>> re.findall(r'\d+(?=x)', s) 
['3', '6', '2', '8'] 

reモジュールのドキュメントから:(?= ...)次の一致しますが、ない...場合

マッチ文字列のいずれかを消費する。 これはルックアヘッドアサーションと呼ばれます。 たとえば、Isaac(?= Asimov)は と一致します。「Isaac」は、「Asimov」によって に続いている場合のみ一致します。指数については

、あなたの代わりにpositive look-behindを使用することができます。

>>> s = '3x3+6x2+2x1+8x0' 
>>> re.findall(r'(?<=x)\d+', s) 
['3', '2', '1', '0'] 

を再度、ドキュメントから:

(?< = ...)と一致した場合の現在の位置文字列の前には、現在の位置で終了する ...の一致があります。 これはポジティブなlookbehind アサーションと呼ばれます。 (?< = abc)defはabcdefで の一致を検出します。lookbehind は3文字をバックアップし、含まれるパターンが一致するかどうかを確認するためです。

+0

いい仕事です。私は肯定的なルックアヘッド/ルックバックのより良い説明を読んだことを思い出すことはできません。 – bernie

1
>>> import re 
>>> equation = '3x3+6x2+2x1+8x0' 
>>> re.findall(r'x([0-9]+)', equation) 
['3', '2', '1', '0'] 
>>> re.findall(r'([0-9]+)x', equation) 
['3', '6', '2', '8'] 
1

正規表現せずにそれを行うにはさらに別の方法、:

>>> eq = '3x3+6x2+2x1+8x0' 
>>> op = eq.split('+') 
['3x3', '6x2', '2x1', '8x0'] 
>>> [o.split('x')[0] for o in op] 
['3', '6', '2', '8'] 
>>> [o.split('x')[1] for o in op] 
['3', '2', '1', '0'] 
関連する問題