Как выбрать ФИО из списка строк и изменить формат даты?

Нужно написать функцию, которая принимает список строк и возвращает список словарей в формате {"name": name, "date": date}, где:

  • name - имя автора
  • date - дата в формате dd/mm/yyyy

Например: [{"name": Wilkie Collins, "date": 08/01/1824}, {"name": James Joyce, "date": 13/01/1941}...]

Список строк:

 8th January 1824 - Wilkie Collins's birthday, author of Woman in White
 13th January 1941 - James Joyce's birthday, author of Ulysses
 14th January 1898 - Lewis Carroll's birthday, author of Alice in Wonderland
 3rd January 1892 - J. R. R. Tolkien's birthday, author of The Hobbit & The Lord of the Rings
 18th January 1936 - Rudyard Kipling's death, author of Jungle Book
 19th January 1809 - Edgar Allan Poe's birthday, author of The Tell Tale Heart

Я начал писать код:

def dict_names():
    dict_names = re.findall(r"[A-Z]+[a-z]+['s]", list_name)
    return dict_names

В итоге выбирает только фамилии, а имя или инициалы не возвращает. Как это исправить? И как отдельно выбрать дату?


Ответы (2 шт):

Автор решения: Kamitonishe

Не могу оставлять комментарии, поэтому так: [a-zA-Z. ]+'

Потом нужно будет обрезать первый пробел и '

Дата: ^ \S+ \S+ \S+
Пробел после ^ опционален и нужен, если строчки начинаются с пробела.

→ Ссылка
Автор решения: Jack_oS

Я бы для таких дат воспользовался dateutil c последующим преобразованием в нужный вам формат %d/%m/%Y, а имена - просто split по 's , если не важен "тип" даты (рождения/смерти):

from dateutil.parser import parse

result_data = []
for row in rows:
    parts = row.split(" - ")
    date =  parse(parts[0]).date().strftime("%d/%m/%Y")
    name = parts[1].split("'s")[0]

    result_data.append({
        'date': date,
        'name': name
        
    }) 

Для вашего тесткейса:

rows = [
    "8th January 1824 - Wilkie Collins's birthday, author of Woman in White",
    "13th January 1941 - James Joyce's birthday, author of Ulysses",
    "14th January 1898 - Lewis Carroll's birthday, author of Alice in Wonderland",
    "3rd January 1892 - J. R. R. Tolkien's birthday, author of The Hobbit & The Lord of the Rings",
    "18th January 1936 - Rudyard Kipling's death, author of Jungle Book",
    "19th January 1809 - Edgar Allan Poe's birthday, author of The Tell Tale Heart"
]

в result_data будет список словарей нужного формата:

>>>result_data

[
 {'name': 'Wilkie Collins', 'date': '08/01/1824'}, 
 {'name': 'James Joyce', 'date': '13/01/1941'}, 
 {'name': 'Lewis Carroll', 'date': '14/01/1898'}, 
 {'name': 'J. R. R. Tolkien', 'date': '03/01/1892'}, 
 {'name': 'Rudyard Kipling', 'date': '18/01/1936'}, 
 {'name': 'Edgar Allan Poe', 'date': '19/01/1809'}
]
→ Ссылка