2017-01-25 1 views
0

Ich versuche, eine Ausgabe abzurufen, die die Generierung einer Fehlermeldung vermeiden würde. "AttributError: Das Objekt 'NoneType' hat kein Attribut 'group'". Ich glaube, dass der Fehler auf die Ausgabe von "matchObj", das "None" ist, zurückzuführen ist. Unten ist mein Code.Gültige Eingabe, um Fehler zu vermeiden (mit re: match)

def processCcDtMdyStamp(datestamp): 
    matchObj = re.match(r'^(\d+)/(\d+)/(\d+)\s', datestamp) 
    (month, day, year) = (matchObj.group(1), matchObj.group(2), matchObj.group(3)) 
    return "%s/%s/%s" % (month, day, year) 

if __name__ == '__main__': 
    print(processCcDtMdyStamp(' 1/6/2015 ')) 

Was wäre eine gültige Eingabe (Datumsstempel) anstatt "1/6/2015"? Vielen Dank im Voraus.

+5

die Whitespaces um die 'Trim 06.01/2015' und sehen, ob es funktioniert. Aber warum sollte man reguläre Ausdrücke verwenden, statt zu versuchen, den String über 'datetime.strptime()' in datetime zu laden? – alecxe

+2

Oder entfernen Sie '^' aus dem RE. – DyZ

+1

Oder fügen Sie ein '\ s *' nach dem '^' (und wenn Sie auch ein '* $' am Ende hinzufügen möchten, so trimmen Sie innerhalb der Regex). – xzoert

Antwort

0
  • re.match() beginnt am Anfang der Zeichenfolge übereinstimmen, so dass die ^ ist überflüssig. Denken Sie auch daran, stattdessen re.search() zu verwenden, da dann das Muster nicht auf den Anfang der Zeichenfolge beschränkt ist und Sie nur die Ziffern und Schrägstriche abgleichen können.
  • Da Ihre Eingabe am Anfang ein Leerzeichen enthält und Ihr Muster nicht, findet sie keine Übereinstimmung. Ziehen Sie die Verwendung von \s? am Anfang und am Ende Ihres Musters in Betracht, wenn ein Leerzeichen wahrscheinlich ist, oder schneiden Sie Leerzeichen ab, bevor Sie Regex anwenden.

>>> import re 
>>> datestamp = ' 1/6/2015 ' 
>>> matchObj = re.search(r'(\d+)/(\d+)/(\d+)', datestamp) 
>>> matchObj.group(1) 
'1' 
Verwandte Themen