4 Stimmen

Regex, um mehrere Daten aus gegebenen Arten von Zeichenfolgen zu erhalten

Ich habe solche Zeichenfolgen in meinem Python-Programm und habe das gewünschte Ergebnis wie angefordert hinzugefügt:

"Sat 1 Dec - 11h + 14h / Sun 2 Dec - 12h30"
("Sat 1 Dec 11h", "Sat 1 Dec 14h", "Sun 2 Dec 12h30")
"Tue 27 + Wed 28 Nov - 20h30"
("Tue 27 Nov 20h30", "Wed 28 Nov 20h30")
"Fri 4 + Sat 5 Jan - 20h30"
("Fri 4 Jan 20h30", "Sat 5 Jan 20h30")
"Wed 23 Jan - 20h"
("Wed 23 Jan 20h")
"Sat 26 Jan - 11h + 14h / Sun 27 Jan - 11h"
("Sat 26 Jan 11h", "Sat 26 Jan 14h", "Sun 27 Jan 11h")
"Fri 8 and Sat 9 Feb - 20h30 + thu 1 feb - 15h"
("Fri 8 Feb 20h30", "Sat 9 Feb 20h30", "Thu 1 feb 15h")
"Sat 2 Mar - 11h + 14h / Sun 3 Mar - 11h"
("Sat 2 Mar 11h", "Sat 2 Mar 14h", "Sun 3 Mar 11h")
"Wed 12, Thu 13, Fri 14 and Sat 15 Jun - 19h + Sun 16 Jun - 12h30"
("Wed 12 Jun 19h", "Thu 13 Jun 19h", "Fri 14 Jun 19h", "Sat 15 Jun 19h", "Sun 16 Jun 12h30")

und mit diesen beiden Regex kann ich die 3 Termine der ersten Zeichenfolge finden:

(Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s([0-9]{1,2}\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))(?:.*?)([0-9]{1,2}[uh\:](?:[0-9]{2})?)

(Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s([0-9]{1,2}\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))(?:.*?\+\s)([0-9]{1,2}[uh\:](?:[0-9]{2})?)

Ist es möglich, alle Termine aus diesen Zeichenfolgen mit einem oder zwei Regex-Mustern zu erhalten (um alle von ihnen abzugleichen). Ich denke also, was es tun muss: den ersten folgenden Monat für jedes Datum finden, wenn nicht angegeben, die entsprechende Uhrzeit erhalten und bei mehreren Stunden pro Datum mehrere Datumzeiten erstellen. Das Format ist nicht so wichtig.

1voto

yurisich Punkte 6779

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.

0voto

Ich habe nicht genug Reputation, um Ihre Frage zu kommentieren, aber könnten Sie nicht einfach Gruppierung verwenden? Fügen Sie Klammern um den Tag-Monats-Teil hinzu und finden Sie die Gruppennummer und fügen Sie sie mit dem stündlich gruppierten Teil zusammen? Dann denke ich, dass Sie nur 1 Regex benötigen, aber ein wenig Bearbeitung der Gruppen. hier ist ein Link http://flockhart.virtualave.net/RBIF0100/regexp.html hier gibt es ein kleines Beispiel für Gruppierung, es ist das zweite, sehr einfach und Sie kennen das wahrscheinlich bereits.

Mit freundlichen Grüßen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X