2017-06-19 4 views
0
def get_project_name(project_string): 
    GG = '%.2f' % (float(re.findall(r"\d+\.?\d*", str(project_string))[0])) 
    print (GG) 
    return GG 

Manchmal sind die Einträge, die diese Funktion erhält, leer und es ergibt sich ein "Index außerhalb des Bereichs Fehler".Was tun, wenn re.findall das Muster nicht findet

Wie kann ich es beheben, um die Einträge zu ignorieren, die leer sind, dann weitermachen? Vielen Dank.

+1

Sie können die Länge des Rückgabewerts von 're.findall()' überprüfen, bevor Sie versuchen, auf das erste Element zuzugreifen. Alternativ können Sie 'try ... except' verwenden. –

+1

Warum verwenden Sie' findall' wenn Sie nur die erste wollen? Verwenden Sie 're.search' –

+0

Ich scanne mehrere Excel-Zeilen, um eine Nummer abzurufen. – Allen

Antwort

2

Sie können try und except verwenden.

def get_project_name(project_string): 
    try: 
     GG = '%.2f' % (float(re.findall(r"\d+\.?\d*", str(project_string))[0])) 
     print GG 
     return GG 
    except Exception: 
     print "Some error message" 
+0

Sie sollten explizit einen 'IndexError' fangen –

0

Wenn Sie wollen die gleiche Logik gelten sowohl für die „gefunden“ und „nicht gefunden“ Fall Sie auch next mit einem Standardwert (aufspalten ein bisschen, um es deutlicher zu machen), verwenden könnte:

p = r"\d+\.?\d*" 
text = str(project_string) 
GG = '%.2f' % (float(next(re.findall(p, text), 0.0))) 

aber wenn Sie nur das erste Spiel benötigen, wäre es tatsächlich besser sein re.finditer oder re.search zu verwenden, aber die Rückkehr Match Objekte, nicht die direkt abgestimmte Saiten.

m = re.search(p, text) 
GG = '%.2f' % (float(m.group()) if m else 0.0)