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