Devo analizzare una lista di stringhe semplici con una struttura nota ma la trovo inutilmente goffo. Sento che mi manca un trucco, forse una semplice regex che renderebbe questo banale?Python - Parse string, struttura nota
La stringa si riferisce a un certo numero di anni/mesi nel futuro, voglio rendere questo in anni decimali.
formato generico: "aYbM"
dove A è il numero di anni, b è il numero di mesi questi possono essere interi ed entrambi sono opzionali (insieme con il loro identificatore)
casi di test:
5Y3M == 5.25
5Y == 5.0
6M == 0.5
10Y11M = 10.91666..
3Y14M = raise ValueError("string '%s' cannot be parsed" %input_string)
i miei tentativi finora hanno coinvolto stringa scissione e stato abbastanza ingombrante anche se producono i risultati corretti:
def parse_aYbM(maturity_code):
maturity = 0
if "Y" in maturity_code:
maturity += float(maturity_code.split("Y")[0])
if "M" in maturity_code:
maturity += float(maturity_code.split("Y")[1].split("M")[0])/12
return maturity
elif "M" in maturity_code:
return float(maturity_code[:-1])/12
else:
return 0
A rigor di termini, il vostro "non-partita" è in realtà corrisponde alla stringa vuota, dal momento che entrambi i pezzi sono opzionali. Questo restituisce 'groups()' come '(None, None)'. È il tuo codice che sta sollevando l'errore ValueError, non il modulo re. Bella soluzione, però. – PaulMcG
È possibile proteggersi da un numero di mesi> = 12 (come indicato nella domanda originale) con 'r" (?: (\ D +) Y)? (? :(0? \ D | 1 [01]) M) ? \ b "' - l'OP non era chiaro sulla presenza o meno di zeri iniziali. E il trailing '\ b' protegge contro la corrispondenza con un anno principale con mese non valido. – PaulMcG
Grazie per la risposta dettagliata, scoppiando quello che fa l'espressione regolare! Ho trovato documentazione su regex presuppone un certo livello di conoscenza ed è quasi impossibile da leggere se non ci sei, quindi questo è davvero utile. – David258