cambiar el formato de hora para una cadena

Quiero escribir una función para cambiar el formato de hora y se usa un desplazamiento para cambiar la fecha

Por ejemplo, tengo una cadena

"this is a string 2012-04-12 23:55 with a 2013-09-12 timezone" 

Quiero cambiarlo por algo como

 "**this is a string 20-Apr-2012 13:40 with a 19-Sep-2013 timezone**" 

Es decir, el formato de los datos cambia de yyyy-mm-dd a dd-bbb-yyyy y la fecha se desplaza por desplazamiento.

Escribo la siguiente función, pero solo da “esta es una cadena 20-Jun-2012 13:40 con una zona horaria 2013-11-12”

 import re import time import datetime def _deIDReportDate(report, offset=654321): redate = re.compile(r"""([0-9]+-[0-9]+-[0-9]+\s+[0-9]+:[0-9]+)|([0-9]+-[0-9]+-[0-9]+)""") match = redate.search(report) for match in redate.finditer(report): dt = match.group() if len(dt) > 10: dt = datetime.datetime.strptime(dt, '%Y-%m-%d %H:%M') dt += datetime.timedelta(seconds=offset) new_time = dt.strftime('%d-%b-%Y %H:%M') newReport = report[:match.start()] + new_time + report[match.end():] return newReport else: dt = datetime.datetime.strptime(dt, '%Y-%m-%d') dt += datetime.timedelta(seconds=offset) new_time = dt.strftime('%d-%b-%Y') newReport = report[:match.start()] + new_time + report[match.end():] return newReport 

¿Alguien puede ayudar a arreglar / mejorar mi código?

Su error se debe a que intenta llamar a report.groups() ; nunca aplicó la expresión regular en el parámetro de report .

Su código se puede simplificar significativamente:

 _dt = re.compile(r""" [12]\d{3}- # Year (1xxx or 2xxx), [0-1]\d- # month (0x, 1x or 2x) [0-3]\d # day (0x, 1x, 2x or 3x) (?:\s # optional: time after a space [0-2]\d: # Hour (0x, 1x or 2x) [0-5]\d # Minute (0x though to 5x) )? """, flags=re.VERBOSE) def _deIDReportDate(report, offset=654321): def replace(match): dt = match.group() if len(dt) > 10: # with time dt = datetime.datetime.strptime(dt, '%Y-%m-%d %H:%M') dt += datetime.timedelta(seconds=offset) return dt.strftime('%d-%b-%Y %H:%M') dt = datetime.datetime.strptime(dt, '%Y-%m-%d') dt += datetime.timedelta(seconds=offset) return dt.strftime('%d-%b-%Y') return _dt.sub(replace, report) 

Se llama a la función de replace nested para cada coincidencia no superpuesta en la cadena de entrada.