2016-08-18 19 views
0

用4個模式處理,例如,下面是4種圖案中存在字符串和結果的列表被返回:Python的正則表達式:使用re.search(),並且如果語句一次

模式1:'A: 45' - > 45(45 - 0)

模式2:'B: 34' - > -34(0 - 34)

模式3:'A: 45, B: 34' - > 11(45 - 34)

模式4:'B: 34, A: 45' - > 11(45 - 34)

是否有可能只使用re.search()一次和一個if聲明來實現這一目標?如果不是,還有其他方法嗎?非常感謝!

我想出的方法是

match = (re.search(r'(A: (\d+))?(B: (\d+))?', str)) 
if match: 
    print(float(match.group(2)) - float(match.group(4))) 

僅與所述第一3個條件優惠和將引發錯誤的所述第一條件要麼match.group(2)match.group(4)NaN

回答

0

在這裏你去(有一個正則表達式和元組拆包的組合):

import re 

strings = ['A: 45', 'B: 34', 'A: 45, B: 34', 'B: 34, A: 45'] 
rx = re.compile(r'([AB]): (\d+)') 

for string in strings: 
    groups = [m.groups() for m in rx.finditer(string)] 
    sum = 0 
    for group in groups: 
     (letter, value) = group 
     if letter == 'A': 
      sum += float(value) 
     elif letter == 'B': 
      sum -= float(value) 
    print(sum) 


你可以把它與列表理解和三元運算符(看看它:))稍短,像這樣:

import re 

strings = ['A: 45', 'B: 34', 'A: 45, B: 34', 'B: 34, A: 45'] 
rx = re.compile(r'([AB]): (\d+)') 

def calc(groups): 
    sum = 0 
    for group in groups: 
     (letter, value) = group 
     c = float(value) if letter == 'A' else -float(value) 
     sum += c 
    return sum 

results = [(string, calc(groups)) \ 
      for string in strings \ 
      for groups in [rx.findall(string)]] 
print(results) 
# [('A: 45', 45.0), ('B: 34', -34.0), ('A: 45, B: 34', 11.0), ('B: 34, A: 45', 11.0)] 


a demo on ideone.com

+0

謝謝@Jan,這很鼓舞人心。只是想知道,有沒有辦法做到這一點只使用'if',否'elif'或'else'? – Map

+1

爲什麼這是一個約束? –

+1

我聞到作業... –