2009-05-30 35 views
0

我不知道這是否正確,但我想要提出一些可以從數學表達式中提取係數和指數的正則表達式。表達式將以'axB + cxD + exF'的形式出現,其中小寫字母是係數,大寫字母是指數。我有一個正則表達式可以匹配他們兩個,但我想知道我是否可以使用2個正則表達式,一個匹配係數,一個指數。有沒有辦法將一個數字與其中一面的字母匹配而不匹配該字母? EG,在'3x3 + 6x2 + 2x1 + 8x0'我需要得到 ['3','6','2','8'] 和 ['3','2','1', '0']Python的正則表達式 - 條件匹配?

+0

你不需要(+ - )? – 2009-05-30 23:49:09

+0

我只是給係數添加了符號...如果有+,那麼我忽略它,並且它旁邊的係數是正值。如果有 - 那麼我只需在\ d之前添加一個 - *就可以了,它工作得很好。 – 2009-05-31 12:50:03

回答

5

您可以使用positive look-ahead來匹配其他內容。爲了匹配係數,你可以使用:

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

re模塊的文檔:

(?= ...) 匹配,如果...下一個相匹配,但不消耗任何字符串。 這被稱爲超前斷言(lookahead assertion)。 例如,Isaac(?= Asimov)將 匹配'Isaac',只有遵循'Asimov'的 。

對於指數,你可以使用positive look-behind代替:

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

再次,從文檔:

(?< = ...)匹配,如果在當前位置字符串前面是 ......的匹配,以當前位置結束。 這稱爲積極向後看 斷言。 (?< = abc)def會在abcdef中找到一個 匹配項,因爲反向查看 將備份3個字符,並檢查包含的模式是否匹配 。

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']