Buscando una forma elegante de:
Por ejemplo, tengo datos de fecha y hora como:
D2018-4-21T3:55+6
2018-4-4T3:15+6
D2018-11-21T12:45+6:30
A veces hay D, a veces no (sin embargo, siempre quiero que sea parte del primer fragmento), no hay ceros al final o al principio de la hora y la zona horaria solo tiene ':' a veces. El punto es que es necesario dividir estos caracteres 'D, T, +' porque es posible que los segmentos no sigan la longitud de sae. Si lo fueran, sería más fácil dividirlos sobre la base del índice. Quiero dividirlos en varios caracteres como T y + y tenerlos como parte de los datos, así como:
['D2018-4-21', 'T3:55', 'TZ+6']
['D2018-4-4', 'T3:15', 'TZ+6']
['D2018-11-21', 'T12:45', 'TZ+6:30']
Sé que una forma más agradable sería limpiar los datos primero y normalizar todas las filas para seguir el mismo patrón, pero tengo curiosidad por saber cómo hacerlo como está.
Por ahora, mi fea solución se ve así:
[i+j for _, i in enumerate(['D','T','TZ']) for __, j in enumerate('D2018-4-21T3:55+6'.replace('T',' ').replace('D', ' ').replace('+', ' +').split()) if _ == __]
Utilizar una regular expression
Referencia: https://docs.python.org/3/library/re.html
(...)
Coincide con cualquier expresión regular que se encuentre entre paréntesis e indica el inicio y el final de un grupo; el contenido de un grupo se puede recuperar después de que se haya realizado una coincidencia, y se puede emparejar más adelante en la cadena con la secuencia especial \ number, que se describe a continuación. Para hacer coincidir los literales '(' o ')', use (o), o enciérrelos dentro de una clase de caracteres: [(], [)].
import re
a = '''D2018-4-21T3:55+6
2018-4-4T3:15+6
D2018-11-21T12:45+6:30'''
b = a.splitlines()
for i in b:
m = re.search(r'^D?(.*)([T].*?)([-+].*)$', i)
if m:
print(["D%s" % m.group(1), m.group(2), "TZ%s" % m.group(3)])
Resultado:
['D2018-4-21', 'T3:55', 'TZ+6']
['D2018-4-4', 'T3:15', 'TZ+6']
['D2018-11-21', 'T12:45', 'TZ+6:30']
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras