Kanonische Python-Notation: So ermitteln und extrahieren Sie nur gültige Datumsausdrücke aus Eingabedaten

Was ist reguläre Notation?

Sie können die kanonische Notation verwenden, um nach komplexen Mustern und Zeichenfolgen zu suchen und diese zu ersetzen. Dieses Mal werde ich diese kanonische Notation verwenden, um ** nur die Zeichenfolge zu lesen und zu extrahieren, die das Datum aus den Eingabedaten darstellt **.

Da es die Basis ist, werde ich die Details weglassen. Bitte lesen Sie das offizielle Dokument in der unten stehenden Referenz.

Persönlich ist die reguläre Notation etwas kompliziert und schwer zu verstehen, aber ich gewöhne mich allmählich daran.

Verwenden Sie die Standardbibliothek re

import re

Vorbereitung der Eingabedaten

Bereiten Sie zunächst die Datumsdaten vor. Ich habe verschiedene Daten als "DATE" in der Liste gespeichert. Es gibt verschiedene Dinge, die nichts mit dem Datum zu tun haben, solche, die bedauerlich sind, und solche, die sich nur in den Trennzeichen unterscheiden.

date.py


DATE = ["2020/01/05",
        "2020/1/5",
        "5. Januar 2020",
        "2020-1-5",
        "2020/1/5",
        "2020.1.5",
        "2020/20/20",
        "2020 1 5",
        "2020 01 05",
        "1995w44w47",
        "Thank you",
        "1998/33/52",
        "3020/1/1",
        ]

Regelmäßige Notation für ein Datum

Wenn Sie beispielsweise "Heute" auf Ihrem Smartphone oder Computer eingeben, werden möglicherweise Ausdrücke wie "5. Januar 2020", "2020/01/05" und "5. Januar 2020" in der prädiktiven Konvertierung angezeigt. Ich werde. Dieses Mal verwenden wir den westlichen Kalender und behandeln die Notation "JJJJ-MM-TT".

Wenn Sie einen häufig verwendeten regulären Datumsausdruck als Beispiel schreiben, können Sie ihn folgendermaßen schreiben: ^ \ d {4} - \ d {1,2} - \ d {1,2} $.

Aber das ist immer noch süß. Die einzige unterstützte Notation ist die durch - getrennte Zeichenfolge. Dort wird \ D verwendet.

\ D steht für ein nicht numerisches Zeichen. Es ist äquivalent zu "[^ 0-9]". Daher kann es verwendet werden, um etwas anderes als Zahlen zu bestimmen, wie z. B. Bindestriche, Zeichenfolgen, Leerzeichen und Punkte.

Ich werde es sofort schaffen.

date_type.py


date_type = re.compile(r"""(
    (^\d{4})        # First 4 digits number
    (\D)            # Something other than numbers
    (\d{1,2})       # 1 or 2 digits number
    (\D)            # Something other than numbers
    (\d{1,2})       # 1 or 2 digits number
    )""",re.VERBOSE)

Es ist fertig. Die Methode verwendet "re.compile ()".

Im Vergleich zu dem oben gezeigten Datum ist $ weg. $ Überprüft, ob das Ende der Zeichenfolge übereinstimmt, diesmal ist das Ende jedoch nicht unbedingt \ d {1,2} = MM. Dies liegt daran, dass in den Eingabedaten der 5. Januar 2020 vorhanden ist. Da am Ende ein "Tag" oder eine andere Zeichenfolge steht, können Sie diesen und den festen "$" nicht verwenden.

Extrahieren Sie das Datum

Nachdem Sie fertig sind, können Sie das Datum extrahieren. Verwenden Sie zunächst die Methode ".search ()", um eine Notation auszugeben, die teilweise mit der kanonischen Notation übereinstimmt.

hit_data_1.py


for date in DATE:
    # Hit data to "hit_date"
    hit_date = date_type.search(date)
    print(hit_date)

Ausgabeergebnis_1.py


<re.Match object; span=(0, 10), match='2020/01/05'>
<re.Match object; span=(0, 8), match='2020/1/5'>
<re.Match object; span=(0, 8), match='5. Januar 2020'>
<re.Match object; span=(0, 8), match='2020-1-5'>
<re.Match object; span=(0, 8), match='2020/1/5'>
<re.Match object; span=(0, 8), match='2020.1.5'>
<re.Match object; span=(0, 10), match='2020/20/20'>
<re.Match object; span=(0, 8), match='2020 1 5'>
<re.Match object; span=(0, 10), match='2020 01 05'>
<re.Match object; span=(0, 10), match='1995w44w47'>
None
<re.Match object; span=(0, 10), match='1998/33/52'>
<re.Match object; span=(0, 8), match='3020/1/1'>

Natürlich wurde "None" an "Thank you" zurückgegeben. Andere Notationen sehen immer noch gut aus.

Lassen Sie als Nächstes "None" im Bool-Typ weg, und wenn es "True" ist, geben Sie den Taple-Typ mit ".groups ()" zurück. Lassen Sie uns das vorherige Skript ein wenig verbessern.

hit_data_2.py


for date in DATE:
    # Hit data to "hit_date"
    hit_date = date_type.search(date)
    bool_value = bool(hit_date)
    if bool_value is True:
        split = hit_date.groups()
        print(split)

Ausgabeergebnis_2.py


('2020/01/05', '2020', '/', '01', '/', '05')
('2020/1/5', '2020', '/', '1', '/', '5')
('5. Januar 2020', '2020', 'Jahr', '1', 'Mond', '5')
('2020-1-5', '2020', '-', '1', '-', '5')
('2020/1/5', '2020', '/', '1', '/', '5')
('2020.1.5', '2020', '.', '1', '.', '5')
('2020/20/20', '2020', '/', '20', '/', '20')
('2020 1 5', '2020', ' ', '1', ' ', '5')
('2020 01 05', '2020', ' ', '01', ' ', '05')
('1995w44w47', '1995', 'w', '44', 'w', '47')
('1998/33/52', '1998', '/', '33', '/', '52')
('3020/1/1', '3020', '/', '1', '/', '1')

Ja! Es wird ein bisschen mehr sein, wenn Sie hierher kommen. Die gewünschten Informationen werden in "[1]", "[3]" und "[5]" im Kalender, Monat und Tag gespeichert. Verwenden Sie das Auspacken von Tapple, um dies zu klassifizieren.

Außerdem ist der Typ im Taple "<class'str"> ", also ändern wir ihn in den Typ" int ". Dies erleichtert die Beurteilung.

Bestimmen Sie als Nächstes, ob Kalender, Monat und Tag vom Typ int inkonsistente Zahlen sind. Ich werde 3000 Jahre weglassen, weil ich es selten täglich benutze. Es können nicht mehr als 13 Monate und nicht mehr als 32 Tage sein. Ich werde es so machen. Wenn Sie dies im Detail tun, müssen Sie über das Jahr nachdenken, in dem es feucht sein wird. Sie können also das Urteil hier ändern.

In Anbetracht des oben Gesagten sieht es so aus.

hit_data_3.py


for date in DATE:
    # Hit data to "hit_date"
    hit_date = date_type.search(date)
    bool_value = bool(hit_date)
    if bool_value is True:
        split = hit_date.groups()

        # Tuple unpacking
        year, month, day = int(split[1]),int(split[3]),int(split[5])

        if year>3000 or month >12 or day > 31:
            print("False")
        else:
            print(year, month, day)

Ausgabeergebnis_3.py


2020 1 5
2020 1 5
2020 1 5
2020 1 5
2020 1 5
2020 1 5
False
2020 1 5
2020 1 5
False
False
False

Ich glaube, ich konnte nur die Ausdrücke extrahieren, die Datumsangaben zu sein schienen.

Beispielcode abgeschlossen

main.py


import re

# data of date
DATE = ["2020/01/05",
        "2020/1/5",
        "5. Januar 2020",
        "2020-1-5",
        "2020/1/5",
        "2020.1.5",
        "2020/20/20",
        "2020 1 5",
        "2020 01 05",
        "1995w44w47",
        "Thank you",
        "1998/33/52",
        "3020/1/1",
        ]

# date :sample of Regular expression operations
date_type = re.compile(r"""(
    (^\d{4})        # First 4 digits number
    (\D)            # Something other than numbers
    (\d{1,2})       # 1 or 2 digits number
    (\D)            # Something other than numbers
    (\d{1,2})       # 1 or 2 digits number
    )""",re.VERBOSE)

for date in DATE:
    # Hit data to "hit_date"
    hit_date = date_type.search(date)
    bool_value = bool(hit_date)
    if bool_value is True:
        split = hit_date.groups()

        # Tuple unpacking
        year, month, day = int(split[1]),int(split[3]),int(split[5])

        if year>3000 or month >12 or day > 31:
            print("False")
        else:
            print(year, month, day)

Ausgabeergebnis.py


2020 1 5
2020 1 5
2020 1 5
2020 1 5
2020 1 5
2020 1 5
False
2020 1 5
2020 1 5
False
False
False

Zusammenfassung

Wie war es. Es mag andere bessere Wege geben, aber das ist alles, was ich tun kann.

Als ich daran dachte, ein Tool zu entwickeln, mit dem ich meine tägliche Arbeit rationalisieren kann, bin ich darauf gestoßen, also habe ich es auch auf Qiita geschrieben.

Ich hoffe, es hilft. Klicken Sie hier für Github

Verweise

Recommended Posts

Kanonische Python-Notation: So ermitteln und extrahieren Sie nur gültige Datumsausdrücke aus Eingabedaten
[Python] Lesen von Daten aus CIFAR-10 und CIFAR-100
Verwenden Sie PIL in Python, um nur die gewünschten Daten aus Exif zu extrahieren
Extrahieren Sie "Nur aktuelles Datum" und "Aktuelles Datum und Uhrzeit" mit Python datetime.
So kratzen Sie Bilddaten von Flickr mit Python
[Python] Extrahieren Sie nur Zahlen aus Listen und Zeichenfolgen
Herstellen einer Verbindung zu verschiedenen DBs über Python (PEP 249) und SQL Alchemy
[Python / Ruby] Mit Code verstehen Wie man Daten aus dem Internet abruft und in CSV schreibt
[Python] Verwendung von input ()
Bestimmen Sie das Datums- und Uhrzeitformat mit Python und konvertieren Sie es in Unixtime
So erhalten Sie mithilfe der Mastodon-API Follower und Follower von Python
So vermeiden Sie doppelte Daten bei der Eingabe von Python in SQLite.
[Python] Wie man MP3-Daten fFT
So berechnen Sie das Datum mit Python
So greifen Sie über Python auf Wikipedia zu
[Python] So ändern Sie die Daten der Zeichenkette (str) auf das Datum (strptime of datetime)
So ermitteln Sie mit Python den Unterschied zwischen Datum und Uhrzeit in Sekunden
[Python] Verwendung der Aufzählungsfunktion (Indexnummer und Element extrahieren)
So stoppen Sie das Programm bis zu einem bestimmten Datum und einer bestimmten Uhrzeit in Python
So verpacken und verteilen Sie Python-Skripte
So installieren und verwenden Sie pandas_datareader [Python]
So aktualisieren Sie Google Sheets von Python
So extrahieren Sie einen Polygonbereich in Python
Portieren und Ändern des Doublet-Solvers von Python2 auf Python3.
Zugriff auf RDS von Lambda (Python)
Python: Verwendung von Einheimischen () und Globalen ()
Verwendung von "deque" für Python-Daten
[Python] Berechnen von MAE und RMSE
Verwendung von Python zip und Aufzählung
Komprimieren Sie Python-Daten und schreiben Sie in SQLite
Verwendung ist und == in Python
[Python] Von der morphologischen Analyse von CSV-Daten bis zur CSV-Ausgabe und Diagrammanzeige [GiNZA]
[Python] So benennen Sie Tabellendaten und geben sie mit csv aus (to_csv-Methode)
So öffnen Sie einen Webbrowser über Python
So generieren Sie eine Sequenz in Python und C ++
[Kaggle] Vom Lesen der Daten bis zur Vorverarbeitung und Codierung
[Python] So ändern Sie das Datumsformat (Anzeigeformat)
Studie aus Python Hour7: Verwendung von Klassen
So generieren Sie ein Python-Objekt aus JSON
[Einführung in Python] Umgang mit Daten im JSON-Format
Abrufen von Daten von MacNote3 und Migrieren zu Write
Wie man gut mit Linux-Befehlen aus Python umgeht
So extrahieren Sie den Koeffizienten aus der Minutenformel
[Python] Fluss vom Web-Scraping zur Datenanalyse
[Python] Verwendung von Hash-Funktion und Taple.
Datenbereinigung Umgang mit fehlenden und Ausreißern
Zur Darstellung von Datum, Uhrzeit, Uhrzeit und Sekunden in Python
Wie man Autokorrelation und partielle Autokorrelation mit Python zeichnet
Python: Entpacken Sie die Standardeingabe mit zipfile
Extrahieren Sie mit Python Daten von einer Webseite
Extrahieren Sie Bilder und Tabellen mit Python aus PDF, um die Berichtslast zu verringern
Ich wollte nur die Daten des gewünschten Datums und der gewünschten Uhrzeit mit Django extrahieren