-2
votes

Comment extraire la date au format aaaa-aaaa à l'aide de Regex Python

Je sais que c'est fondamental mais quelqu'un peut fournir une solution de regex pour extraire "1234-5678" de "ABCFD1234-5678GFVJH". Ici, les chaînes principales et fuyantes peuvent être n'importe quoi et ils ne sont peut-être pas là toujours. La chaîne peut être juste "1234-5678". Il est garanti qu'il n'y a pas d'alphabet entre les chiffres uniquement "-" peut être là. Il y a un autre format de la chaîne "1234-56". I.e. Le deuxième numéro peut être de longueur 2 ou 4. Veuillez voir l'explication ci-dessous:

input  :a = "abcfd1234-5678gfvjh"

output :"1234-5678"

input  :a = "abcfd1234-56gfvjh"

output :"1234-56"

input  :a = "1234-5678hgjg"

output :"1234-5678"

input  :a = "abcfd1234-5678"

output :"1234-5678"

input  :a = "1234-56"

output :"1234-56"


2 commentaires

Quel format type DDDD-DDDDD est-il censé être?


@ user2357112 édité ma question ... Modifié le format 'yyyy-aaaayy'. C'est un format de durée d'un an.


3 Réponses :


1
votes
\d{4}[-–](?:\d{4}|\d{2})
See an explanation here: https://regex101.com/r/kocRuY/2Basically we say to search for four digits then a hyphen then either (using a non-capturing group to bracket) four digits or, failing that, two digits.You should use the regex "search" method rather than "match" method as the processor will have to find where the sequence starts in the string. If you are restricted to matching from the start with "match", then you could add some sort of quantifier at the start to gobble up the start characters.

3 commentaires

Merci pour une réponse rapide, j'ai essayé votre méthode mais cela ne fonctionne pas pour A = "1482-1484"


@Aman, c'est parce que vous utilisez un tiret plus long, plutôt qu'un trait d'union, assorti ainsi un trait d'union. J'ai mis à jour le regex pour correspondre à un trait d'union ou à un tiret à l'aide d'un ensemble de caractères. Cela fonctionne maintenant pour votre exemple (voir le lien REGEX101 pour confirmation). Si vous devez prendre en charge les autres variations sur les tirets / traits d'union, ajoutez-les simplement au jeu de caractères.


Ça a marché comme sur des roulettes. Merci beaucoup. Je ne peux pas croire comment je peux être si stupide et ne pas remarquer la différence entre le véritable trait d'union et celui donné dans la chaîne.



0
votes
>>> import re
>>> re.findall('\d+-\d+', "abcfd1234-5678gfvjh")
['1234-5678']
you can try different regexes in https://regex101.com/

2 commentaires

@ Ishefi Merci de réponse rapide, j'ai essayé votre méthode mais cela ne fonctionne pas pour a = "1482-1484"


C'est un trait d'union différente ... il suffit de l'ajouter à la regex. Vous pouvez tester et apprendre les expressions dans le lien de ma réponse.



0
votes

Une douzaine de duplicats sur Stackoverflow code>.
Comme la demande se produit très souvent, il y a un module appelé datefinder code> strong> ( PIP Installez Datefinder code>). Vous l'appelleriez alors comme ceci:

import datefinder
matches = datefinder.find_dates(your_string_here)
for match in matches:
    print (match)


1 commentaires

En fait, cette méthode n'est pas très efficace. Dans mon cas lorsque je donne la contribution comme "1917-1918", cela m'a donné la sortie suivante: '1917-05-04 00:00:00' et '1918-05-04 00:00:00' ce qui n'est pas quoi Je m'attendais à. Beaucoup de reformatage doivent être effectués sur la sortie pour moi de l'utiliser. De plus, lorsque je donne l'entrée comme "1917-18", cela ne fonctionne pas. Merci pour votre réponse cependant. @Jan