Notation canonique Python: comment déterminer et extraire uniquement les expressions de date valides des données d'entrée

Qu'est-ce que la notation régulière?

Vous pouvez utiliser la notation canonique pour rechercher et remplacer des modèles et des chaînes complexes. Cette fois, j'utiliserai cette notation canonique pour ** lire et extraire uniquement la chaîne de caractères qui représente la date à partir des données d'entrée **.

Puisque c'est la base, je vais omettre les détails. Veuillez lire le document officiel dans la référence ci-dessous.

Personnellement, la notation régulière est un peu compliquée et difficile à appréhender, mais je m'y habitue progressivement.

Utilisez la bibliothèque standard re

import re

Préparation des données d'entrée

Tout d'abord, préparez les données de date. J'ai stocké diverses données comme «DATE» dans la liste. Il y a diverses choses qui n'ont rien à voir avec la date, celles qui sont regrettables, et celles qui ne diffèrent que par les délimiteurs.

date.py


DATE = ["2020/01/05",
        "2020/1/5",
        "5 janvier 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",
        ]

Notation régulière pour une date

Par exemple, si vous saisissez «aujourd'hui» sur votre smartphone ou votre ordinateur, des expressions telles que «5 janvier 2020», «05/01/2020» et «5 janvier 2020» peuvent s'afficher dans la conversion prédictive. Je vais. Cette fois, nous utiliserons le calendrier occidental et gérerons la notation «AAAA-MM-JJ».

Si vous écrivez une expression régulière de date couramment utilisée comme exemple, vous pouvez l'écrire comme ceci: ^ \ d {4} - \ d {1,2} - \ d {1,2} $.

Mais c'est toujours doux. La seule notation prise en charge est la chaîne séparée par -. C'est là que «\ D» est utilisé.

«\ D» représente tout caractère non numérique. C'est équivalent à «[^ 0-9]». Par conséquent, il peut être utilisé pour déterminer autre chose que des nombres, tels que des tirets, des chaînes, des espaces et des points.

Je vais le faire à la fois.

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)

C'est fait. La méthode utilise re.compile ().

Par rapport à la date indiquée ci-dessus, «» a disparu. `Vérifie si la fin de la chaîne correspond, mais cette fois la fin n'est pas nécessairement\ d {1,2}=MM. En effet, le «5 janvier 2020» existe dans les données d'entrée. Étant donné qu'il y a un jour à la fin ou une autre chaîne, vous ne pouvez pas utiliser cela et le $ `fixe.

Extraire la date

Maintenant que vous êtes prêt, pensez à extraire la date. Tout d'abord, utilisez la méthode .search () pour afficher une notation qui correspond partiellement à la notation régulière.

hit_data_1.py


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

Résultat de sortie_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 janvier 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'>

Naturellement, "Aucun" a été renvoyé à "Merci". D'autres notations ont toujours l'air bien.

Ensuite, omettez «None» dans le type booléen, et si c'est «True», renvoyez le type taple avec «.groups ()». Améliorons un peu le script précédent.

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)

Résultat de sortie_2.py


('2020/01/05', '2020', '/', '01', '/', '05')
('2020/1/5', '2020', '/', '1', '/', '5')
('5 janvier 2020', '2020', 'Année', '1', 'Mois', '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')

Oui! Ce sera un peu plus quand vous viendrez ici. Les informations que vous souhaitez sont stockées dans «[1]», «[3]» et «[5]», respectivement, dans le calendrier, le mois et le jour. Utilisez le déballage de tapple pour classer cela.

De plus, le type dans le taple est <class'str '>, changeons-le donc en type int. Cela facilitera le jugement.

Ensuite, déterminez si le calendrier, le mois et le jour de type int sont des nombres incohérents. J'omettrai 3000 ans car je l'utilise rarement au quotidien. Il ne peut y avoir plus de 13 mois et pas plus de 32 jours. Je vais le faire comme ça. Si vous le faites en détail, vous devrez penser à l'année où il sera humide, alors n'hésitez pas à changer le jugement ici.

Compte tenu de ce qui précède, cela ressemble à ceci.

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)

Résultat de sortie_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

Je pense avoir pu extraire uniquement les expressions qui semblaient être des dates.

Exemple de code terminé

main.py


import re

# data of date
DATE = ["2020/01/05",
        "2020/1/5",
        "5 janvier 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)

Résultat de sortie.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

Résumé

Comment était-ce. Il y a peut-être d'autres meilleures façons, mais c'est tout ce que je peux faire.

Quand je pensais développer un outil pour rationaliser mon travail quotidien, je suis tombé dessus, alors je l'ai écrit sur Qiita également.

J'espère que cela aide. Cliquez ici pour Github

Les références

Recommended Posts

Notation canonique Python: comment déterminer et extraire uniquement les expressions de date valides des données d'entrée
[Python] Comment lire les données de CIFAR-10 et CIFAR-100
Utilisez PIL en Python pour extraire uniquement les données souhaitées d'Exif
Extraire "date actuelle uniquement" et "date et heure actuelles" avec python datetime.
Comment récupérer des données d'image de Flickr avec Python
[Python] Extraire uniquement les nombres des listes et des chaînes de caractères
Comment se connecter à diverses bases de données à partir de Python (PEP 249) et SQL Alchemy
[Python / Ruby] Comprendre le code Comment obtenir des données en ligne et les écrire au format CSV
[Python] Comment utiliser input ()
Déterminez le format de la date et de l'heure avec Python et convertissez-le en Unixtime
Comment obtenir des abonnés et des abonnés de Python à l'aide de l'API Mastodon
Comment éviter la duplication des données lors de la saisie de Python vers SQLite.
[Python] Comment FFT des données mp3
Comment calculer la date avec python
Comment accéder à wikipedia depuis python
[Python] Comment changer les données de la chaîne de caractères (str) en date (strptime de datetime)
Comment obtenir la différence de date et d'heure en secondes avec Python
[Python] Comment utiliser la fonction enumerate (extraire le numéro d'index et l'élément)
Comment arrêter le programme jusqu'à une date et une heure spécifiques en python
Comment empaqueter et distribuer des scripts Python
Comment installer et utiliser pandas_datareader [Python]
Comment mettre à jour Google Sheets à partir de Python
Comment extraire une zone de polygone en Python
Portage et modification du solveur de doublets de python2 vers python3.
Comment accéder à RDS depuis Lambda (python)
python: Comment utiliser les locals () et globals ()
Comment utiliser "deque" pour les données Python
[Python] Comment calculer MAE et RMSE
Comment utiliser le zip Python et énumérer
Compressez les données python et écrivez sur sqlite
Comment utiliser is et == en Python
[Python] De l'analyse morphologique des données CSV à la sortie CSV et à l'affichage graphique [GiNZA]
[Python] Comment nommer les données de table et les sortir avec csv (méthode to_csv)
Comment ouvrir un navigateur Web à partir de python
Comment générer une séquence en Python et C ++
[Kaggle] De la lecture des données au prétraitement et au codage
[Python] Comment changer le format de la date (format d'affichage)
Étude de Python Hour7: Comment utiliser les classes
Comment générer un objet Python à partir de JSON
[Introduction à Python] Comment gérer les données au format JSON
Récupération des données de MacNote3 et migration vers Write
Comment bien gérer les commandes Linux à partir de Python
Comment extraire le coefficient de la formule minute
[Python] Flux du scraping Web à l'analyse des données
[Python] Comment utiliser la fonction de hachage et taple.
Nettoyage des données Comment gérer les valeurs manquantes et aberrantes
Pour représenter la date, l'heure, l'heure et les secondes en Python
Comment tracer l'autocorrélation et l'autocorrélation partielle avec Python
Python: décompressez depuis l'entrée standard en utilisant zipfile
Extraire des données d'une page Web avec Python
Extraire des images et des tableaux de pdf avec python pour réduire la charge de reporting
Je voulais juste extraire les données de la date et de l'heure souhaitées avec Django