Следующий код решает проблему следующего дня после некоторых определенных дней, чтобы найти, когда в строке есть «24: 00»: 31 января, 28 февраля, 29 февраля, 30 июня, 31 декабря и т. Д.
import re
ss1 = '''Units CFS
Type INST-VAL
1 01 Jan 1997, 02:00 1933.0
2 12 Feb 1997, 04:00 1918.0
3 26 May 1997, 06:00 1918.0
4 15 Aug 1997, 08:00 1904.0
5 09 Dec 1997, 10:00 1904.0'''
ss2 = '''Units CFS
Type INST-VAL
1 31 Jan 1997, 11:00 1933.0
2 28 Feb 1997, 11:00 1918.0
2 29 Feb 1997, 11:00 1918.0
3 31 Mar 1997, 11:00 1918.0
4 30 Sep 1997, 11:00 1904.0
5 31 Dec 1997, 11:00 1904.0'''
ss3 = '''Units CFS
Type INST-VAL
1 31 Jan 1997, 24:00 1933.0
2 28 Feb 2011, 24:00 1700.2
2 29 Feb 2011, 24:00 1700.0
2 28 Feb 2012, 24:00 1801.8
2 29 Feb 2012, 24:00 1801.0
3 31 Mar 1997, 24:00 1918.0
4 30 Sep 1997, 24:00 1904.0
5 31 Dec 1997, 24:00 1904.0'''
bis = ('1904', '1908', '1912', '1916', '1920', '1924', '1928', '1932', '1936', '1940',
'1944', '1948', '1952', '1956', '1960', '1964', '1968', '1972', '1976', '1980',
'1984', '1988', '1992', '1996', '2000', '2004', '2008', '2012', '2016', '2020',
'2024', '2028', '2032', '2036', '2040', '2044', '2048', '2052', '2056', '2060',
'2064', '2068', '2072', '2076', '2080', '2084', '2088', '2092', '2096', '2104')
months = dict(zip('Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(),xrange(1,13)))
firstday_nextmonth = {('31','Jan'):'01/02/', ('31','Mar'):'01/04/',
('30','Apr'):'01/05/', ('31','May'):'01/06/', ('30','Jun'):'01/07/',
('31','Jul'):'01/08/', ('31','Aug'):'01/09/', ('30','Sep'):'01/10/',
('31','Oct'):'01/11/', ('30','Nov'):'01/12/', ('31','Dec'):'01/01/'}
di = {'1':'MADRID ','2':'HUAHINE','3':'MOSCOW ','4':'OSAKA ','5':'VALPAR.'}
def repl(mat, fdnm = firstday_nextmonth, months = months, sites = di, bisextiles = bis):
d,m,y = mat.group(2,3,4)
if mat.group(5)=='24:00':
if (d,m)==('31','Dec'):
dmy = '01/01/%d' % (int(y)+1)
elif (d,m) == ('29','Feb'):
if y in bisextiles:
dmy = '01/03/' + y
else:
dmy = '!!!!!!!!!!'
elif (d,m)==('28','Feb'):
if y in bisextiles:
dmy = '29/02/' + y
else:
dmy = '01/03/' + y
elif (d,m) in fdnm:
dmy = fdnm[(d,m)] + y
else:
dmy = '%02d/%02d/%s' % (int(mat.group(2))+1,months[m],y)
elif (d,m) == ('29','Feb') and y not in bisextiles:
dmy = '!!!!!!!!!!'
else:
dmy = '%s/%02d/%s' % (d,months[m],y)
return '%s %s %s:00' % (sites[mat.group(1)],
dmy,
mat.group(5).replace('24:00','00:00'))
reg = re.compile('^(\d+) ([012]\d|30|31) ([a-z]+) (\d{4}), (\d\d:\d\d)(?= \d+.\d+)',
re.IGNORECASE|re.MULTILINE)
for ss in (ss1,ss2,ss3):
print ss
print
print reg.sub(repl,ss)
print '\n=========================================================\n'
результат
Units CFS
Type INST-VAL
1 01 Jan 1997, 02:00 1933.0
2 12 Feb 1997, 04:00 1918.0
3 26 May 1997, 06:00 1918.0
4 15 Aug 1997, 08:00 1904.0
5 09 Dec 1997, 10:00 1904.0
Units CFS
Type INST-VAL
MADRID 01/01/1997 02:00:00 1933.0
HUAHINE 12/02/1997 04:00:00 1918.0
MOSCOW 26/05/1997 06:00:00 1918.0
OSAKA 15/08/1997 08:00:00 1904.0
VALPAR. 09/12/1997 10:00:00 1904.0
=========================================================
Units CFS
Type INST-VAL
1 31 Jan 1997, 11:00 1933.0
2 28 Feb 1997, 11:00 1918.0
2 29 Feb 1997, 11:00 1918.0
3 31 Mar 1997, 11:00 1918.0
4 30 Sep 1997, 11:00 1904.0
5 31 Dec 1997, 11:00 1904.0
Units CFS
Type INST-VAL
MADRID 31/01/1997 11:00:00 1933.0
HUAHINE 28/02/1997 11:00:00 1918.0
HUAHINE !!!!!!!!!! 11:00:00 1918.0
MOSCOW 31/03/1997 11:00:00 1918.0
OSAKA 30/09/1997 11:00:00 1904.0
VALPAR. 31/12/1997 11:00:00 1904.0
=========================================================
Units CFS
Type INST-VAL
1 31 Jan 1997, 24:00 1933.0
2 28 Feb 2011, 24:00 1700.2
2 29 Feb 2011, 24:00 1700.0
2 28 Feb 2012, 24:00 1801.8
2 29 Feb 2012, 24:00 1801.0
3 31 Mar 1997, 24:00 1918.0
4 30 Sep 1997, 24:00 1904.0
5 31 Dec 1997, 24:00 1904.0
Units CFS
Type INST-VAL
MADRID 01/02/1997 00:00:00 1933.0
HUAHINE 01/03/2011 00:00:00 1700.2
HUAHINE !!!!!!!!!! 00:00:00 1700.0
HUAHINE 29/02/2012 00:00:00 1801.8
HUAHINE 01/03/2012 00:00:00 1801.0
MOSCOW 01/04/1997 00:00:00 1918.0
OSAKA 01/10/1997 00:00:00 1904.0
VALPAR. 01/01/1998 00:00:00 1904.0
=========================================================