Python регулярное выражение для даты и чисел, найти формат даты - PullRequest
0 голосов
/ 25 марта 2019

Как извлечь только даты из текстового файла с помощью регулярных выражений в Python 3?

Ниже мой текущий код:

import datetime
from datetime import date
import re
s = "birthday on 20/12/2018 and wedding aniversry on 04/01/1997 and dob is on 
09/07/1897"
match = re.search(r'\d{2}/\d{2}/\d{4}', s)
date = datetime.datetime.strptime(match.group(), '%Y-%m-%d').date()
print (date)

Ожидаемый результат -

20/12/2018
04/01/1997
09/07/1897

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Вы все делаете правильно, ожидайте эту строку,

date = datetime.datetime.strptime(match.group(), '%d/%m/%Y').date()

Вы должны указать тот же формат, что и ваш ввод в datetime.strptime.

'%Y-%m-%d' >> 2018-12-20
'%d/%m/%Y' >> 20/12/2018

Редактировать

Если вы не ищете объект даты и времени.Вы можете сделать это

results = re.findall(r'\d{2}/\d{2}/\d{4}', s)
print('\n'.join(results))

Вывод

In [20]: results = re.findall(r'\d{2}/\d{2}/\d{4}', s)

In [21]: print('\n'.join(results))
20/12/2018
04/01/1997
09/07/1897
0 голосов
/ 25 марта 2019

Недопустимый формат даты рядом с '%Y-%m-%d', поскольку он должен был '%d/%m/%Y 'смотреть на предоставленную вами дату: birthday on 20/12/2018 (dd/mm/yyyy)

Изменить это :

date = datetime.datetime.strptime(match.group(), '%Y-%m-%d').date()

С этим :

date = datetime.datetime.strptime(match.group(), '%d/%m/%Y').date()

Ваше исправление :

import datetime
from datetime import date
import re
s = "birthday on 20/12/2018"
match = re.search(r'\d{2}/\d{2}/\d{4}', s)
date = datetime.datetime.strptime(match.group(), '%d/%m/%Y').date()
print (date)

Но

Зачем ввязываться во все неприятности? Когда у них есть более простые и элегантные способы.

Использование dparser:

import dateutil.parser as dparser
dt_1 = "birthday on 20/12/2018"
print("Date: {}".format(dparser.parse(dt_1,fuzzy=True).date()))

OUTPUT

Date: 2018-12-20

EDIT

С вашим отредактированным вопросом, который теперь имеет несколько дат, вы можете извлечь их, используя regex:

import re
s = "birthday on 20/12/2018 and wedding aniversry on 04/01/1997 and dob is on 09/07/1897"
pattern = r'\d{2}/\d{2}/\d{4}'
print("\n".join(re.findall(pattern,s)))

OUTPUT

20/12/2018
04/01/1997
09/07/1897

OR

Использование dateutil:

from dateutil.parser import parse

for s in s.split():
    try:
        print(parse(s))
    except ValueError:
        pass

OUTPUT

2018-12-20 00:00:00
1997-04-01 00:00:00
1897-09-07 00:00:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...