2
votes

Extraire la date des chaînes contenant des noms + des dates

J'ai besoin d'extraire les dates d'une série de chaînes comme celle-ci:

for index,row in DF.iterrows():
    try:
        if math.isnan(row['Data_Nasterii']):
            match = re.search(r'\d{2}.\d{2}.\d{4}', row['Prenume'])
            date = datetime.strptime(match.group(), '%d.%m.%Y').date()
            s = datetime.strftime(datetime.strptime(str(date), '%Y-%m-%d'), '%d-%m-%Y')
            row['Data_Nasterii'] = s
    except TypeError:
        pass

ou

'CLAUDIU-MIHAI17.12.1999'

Comment faire cela?

J'ai essayé ceci:

'MIHAI MÄ‚D2Ä‚3.07.1958'


3 commentaires

qu'avez-vous essayé? avez-vous essayé les expressions régulières?


@Nullman voir ma question modifiée


. ne signifie pas le point de caractère, cela signifie n'importe quel caractère et doit être échappé. essayez ceci: r '\ d + \. \ d + \. \ d +'


4 Réponses :


2
votes

Le . (point) dans l'expression régulière ne signifie pas le point de caractère, cela signifie «n'importe quoi» et doit être échappé ( \ ) pour être un point réel . Autre que cela, votre premier groupe est \ d {2} , mais certaines de vos dates ont un jour à un chiffre.
J'utiliserais ce qui suit:

''.join(re.search(r'(\d*)(?:[^0-9\.]*)(\d*\.\d+\.\d+)', row['Prenume']).groups())

qui signifie au moins un nombre suivi d'un point suivi d'au moins un nombre .....
si vous avez des personnages mixtes dans votre journée, vous pouvez essayer la solution suivante (sous-par):

re.search(r'(\d+\.\d+\.\d+)', row['Prenume'])

cela filtrera jusqu'à un bloc dans votre "journée", son pas joli mais ça marche (et renvoie une chaîne)


2 commentaires

Ensuite, vous pouvez vérifier ma solution.


@Nullman Merci beaucoup! Une seule question. Pour cet exemple: 'MIHAI MĂD2Ă3.07.1958' il faut '3.07.1958' MAIS cela devrait être '23 .07.1958 '. Le chiffre «2» est à l'intérieur du nom



2
votes

Vous pouvez utiliser l'accesseur str avec une expression régulière:

DF['Prenume'].str.extract(r'\d{1,2}\.\d{2}\.\d{4}')


0 commentaires

1
votes

Vous devez échapper le point (.) comme \. ou vous pouvez l'utiliser dans une classe de caractères - " [.] ". C'est un méta caractère dans regex, qui correspond à n'importe quel caractère. Si vous avez besoin de valider plus de vous pouvez le renvoyer! par exemple: r '[0-9] {2} [.] [0-9] {2} [.] [0-9] {4}' ou r '\ d {2} \. \ d {2} \. \ d {4} '

text = 'CLAUDIU-MIHAI17.12.1999'
pattern = r'\d{2}\.\d{2}\.\d{4}'

if re.search(pattern, text):
    print("yes")


0 commentaires

1
votes

2 commentaires

Je vous remercie! Puis-je appliquer cela sur une seule valeur et non sur une colonne?


Bien sûr. s1 = 'asd 03.12.1999' , puis print (dparser.parse (s1, fuzzy = True)) et vous obtenez 1999-03-12 00: 00:00 .