Ich habe dich gestartet. Das ist meine Interpretation deines Problems. Ich überlasse dir die Implementierung von parse_complex
.
class DateParser(object):
"""Termine entsprechend der benutzerdefinierten Regeln hier analysieren:
>>> DateParser("Sat 1 Dec - 11h + 14h / Sun 2 Dec - 12h30").parse()
("Sat 1 Dec 11h", "Sat 1 Dec 14h", "Sun 2 Dec 12h30")
>>> DateParser("Tue 27 + Wed 28 Nov - 20h30").parse()
("Tue 27 Nov 20h30", "Wed 28 Nov 20h30")
>>> DateParser("Fri 4 + Sat 5 Jan - 20h30").parse()
("Fri 4 Jan 20h30", "Sat 5 Jan 20h30")
>>> DateParser("Wed 23 Jan - 20h").parse()
("Wed 23 Jan 20h")
>>> DateParser("Sat 26 Jan - 11h + 14h / Sun 27 Jan - 11h").parse()
("Sat 26 Jan 11h", "Sat 26 Jan 14h", "Sun 27 Jan 11h")
>>> DateParser("Fri 8 and Sat 9 Feb - 20h30 + thu 1 feb - 15h").parse()
("Fri 8 Feb 20h30", "Sat 9 Feb 20h30", "Thu 1 feb 15h")
>>> DateParse("Sat 2 Mar - 11h + 14h / Sun 3 Mar - 11h").parse()
("Sat 2 Mar 11h", "Sat 2 Mar 14h", "Sun 3 Mar 11h")
>>> DateParser("Wed 12, Thu 13, Fri 14 and Sat 15 Jun - 19h + Sun 16 Jun - 12h30").parse()
("Wed 12 Jun 19h", "Thu 13 Jun 19h", "Fri 14 Jun 19h", "Sat 15 Jun 19h", "Sun 16 Jun 12h30")
"""
def __init__(self, line):
self.date = line
self.dates = self.split_dates(line)
self.final = []
self.days = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
self.mons = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec']
def parse(self):
if self.is_complex():
self.parse_complex()
else:
self.parse_simple()
return tuple(self.final)
def parse_simple(self):
"""typische Formate:
Tag 00 + Tag 01 Mon - 00h00
Tag 00 Mon - 00h00 + 01h00
Tag 00 Mon - 00h00 / Tag 02 Mon - 00h00
"""
for date in self.dates:
mods = self.split_modifiers(date)
date_mods = []
for mod in mods:
if self.is_complete(mod):
#nur *ein* Referenzdatum
base_date, time = self.split_time(mod)
date_mods.append(time)
else:
date_mods.append(mod)
for mod in date_mods:
if self.is_hour(mod):
#Sat 1 Dec - 11h + 14h
self.final.append(' '.join([base_date, mod]))
else:
#Fri 4 + Sat 5 Jan - 20h30
self.final.append(' '.join([mod, self.extract_month(base_date), time]))
def parse_complex(self):
"""typisches Format:
Tag 00, Tag 01 und Tag 02 Mon - 00h00 + Tag 03 Mon 01h00
"""
raise NotImplementedError()
def is_complex(self):
"""das Vorhandensein des komplexen Datumsattributs erfordert eine spezielle Analyse"""
return self.date.find(' and ') > -1
def is_complete(self, section):
"""Abschnitt hat das Format `Tag 00 Mon - 00h00`
darf keine Modifikatoren haben, um Vollständigkeit festzustellen
"""
sections = map(lambda x: x.lower(), section.split())
try:
dow, dom, moy, dash, time = sections
except ValueError, e:
return False
return all([dow in self.days, moy in self.mons])
def is_hour(self, section):
return section[0].isdigit()
def is_day(self, section):
return section[:3].lower() in self.days
def extract_month(self, section):
"""gibt den im String vorhandenen Monat zurück, falls vorhanden"""
for mon in self.mons:
if section.lower().find(mon) > -1:
found = section.lower().index(mon)
return section[found : found + 3]
return None
def split_dates(self, section):
"""einzelne Termine aus einer Liste von Terminen aufteilen"""
return section.split(' / ')
def split_time(self, section):
"""einzelne Zeiten aus einem vollständigen Datum aufteilen"""
return section.split(' - ')
def split_modifiers(self, section):
"""erweitern eines Datums, indem angedeutet wird, dass sie ein Datum oder eine Zeit gemeinsam haben
Modifikatoren ändern ihre Bedeutung beim Parsen eines komplexen Datums
"""
return section.split(' + ')
>>> DateParser("Fri 4 + Sat 5 Jan - 20h30 / Sat 1 Dec - 11h + 14h + 16h / Sun 2 Dec - 12h30").parse()
('Fri 4 Jan 20h30', 'Sat 5 Jan 20h30', 'Sat 1 Dec 11h', 'Sat 1 Dec 14h', 'Sat 1 Dec 16h', 'Sun 2 Dec 12h30')
Wenn Sie Fragen zur Art und Weise haben, wie ich diese Klasse dokumentiert habe, können Sie sich gerne bei mir melden, und ich kann Ihnen weiterhelfen. Dieses Problem war etwas komplexer als ich zuerst dachte, ich muss zuerst noch ein paar andere Dinge erledigen.