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
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",
]
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.
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.
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
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
Recommended Posts