2015-11-13 85 views
0

我需要一個正則表達式來解析包含分數和操作的字符串[+, -, *, or /]並返回包含分子,分母和使用findall函數中的re的5元素元組模塊。正則表達式使用python re模塊的分數數學表達式

實施例:str = "15/9 + -9/5"

輸出應形式[("15","9","+","-9","5")]

我能夠想出這個的:

pattern = r'-?\d+|\s+\W\s+' 

print(re.findall(pattarn,str)) 

其產生["15","9"," + ","-9","5"]的輸出。但是經過這麼長時間的擺弄之後,我無法把它變成一個5元組元組,而且如果沒有匹配周圍的空白區域,我也無法匹配這個操作。

+0

「[tuple([」15「,」9「,」+「,」-9「,」5「])]產生了[(」15「,」9「,」 +「,」-9「,」5「)]'?你是否也需要擺脫空白?如果是這樣,[[15],[9],[+],「-9」,「5」]]]]中的[[tuple([x.replace('','')] [(「15」,「9」,「+」,「-9」,「5」)]。 – dorverbin

回答

0

這種模式將工作:

(-?\d+)\/(\d+)\s+([+\-*/])\s+(-?\d+)\/(\d+) 
#lets walk through it 
(-?\d+) #matches any group of digits that may or may not have a `-` sign to group 1 
     \/ #escape character to match `/` 
     (\d+) #matches any group of digits to group 2 
       \s+([+\-*/])\s+ #matches any '+,-,*,/' character and puts only that into group 3 (whitespace is not captured in group) 
           (-?\d+)\/(\d+) #exactly the same as group 1/2 for groups 4/5 

演示了這一點:

>>> s = "15/9 + -9/5 6/12 * 2/3" 
>>> re.findall('(-?\d+)\/(\d+)\s([+\-*/])\s(-?\d+)\/(\d+)',s) 
[('15', '9', '+', '-9', '5'), ('6', '12', '*', '2', '3')] 
+0

絕對做到了!這是一個很好的解釋!謝謝,我學到了很多東西! – CodeSandwich

0

來標記基於一個正則表達式的字符串的一般方法是:

import re 

pattern = "\s*(\d+|[/+*-])" 

def tokens(x): 
    return [ m.group(1) for m in re.finditer(pattern, x) ] 

print tokens("9/4 + 6 ") 

注意事項:

  • 正則表達式以\s*開始,以傳遞任何初始空白。
  • 與令牌相匹配的正則表達式的部分封閉在parens中以形成捕獲。
  • 不同的令牌模式在捕捉中被交替操作|分開。
  • 請小心使用\W,因爲它也會匹配空格。
相關問題