Pythoni c способ циклического перебора списка шаблонов регулярных выражений и извлечения строки - PullRequest
0 голосов
/ 18 февраля 2020

Как человек, который писал все на R годами, я все еще не уверен, что лучше всего справлюсь с итерациями / списками в python. В качестве примера, скажем, у меня есть строка:

string = "Imported as of 1 Jan 2020"

И я хочу построить объект даты из строки, где мои шаблоны хранятся в named list в R или dict в python следующим образом:

dates_r =  list(
    day = '[0-9]{1,2}(?=\\s+)',
    month = '(\\w+)(?=(\\s)[0-9]{4})',
    year = '[0-9]{4}$'
)

dates_py = {
    'day':r'[0-9]{1,2}(?=\s+)',
    'month':r'(\w+)(?=(\s)[0-9]{4})',
    'year':r'[0-9]{4}$'
}

В РИ можно просто :

> dates_out_r <- mapply(stringi::stri_extract_all_regex, pattern = dates_r, str = string, simplify = F)
> dates_out_r 
$day
[1] "1"

$month
[1] "Jan"

$year
[1] "2020"

Есть ли способ лучше, чем то, что я сейчас делаю в python?

dates_py = {
    'day': r'[0-9]{1,2}(?=\s+)',
    'month': r'(\w+)(?=(\s)[0-9]{4})',
    'year': r'[0-9]{4}$'
}

dates_out = {}

for key, value in dates_py.items():
    rgx = re.compile(value)
    dates_out[key] = re.search(rgx, date_str)[0]
dates_out
{'day': '1', 'month': 'February', 'year': '2020'}

1 Ответ

1 голос
/ 18 февраля 2020

вы можете использовать интеллектуальное понимание
по сути то же самое, что и for l oop, но короче

d = {k: re.search(regex, string)[0] for k, regex in dates_py.items()}

также есть своего рода эквивалент mapply, но выглядит довольно некрасиво (на по крайней мере, в моей реализации)

dict(map(lambda k, regex: (k, re.search(regex, string)[0]), dates_py.keys(), dates_py.values()))

также обратите внимание, что регистр re.search(...) is None не обрабатывается, обработка добавит событие больше кода, что не здорово для однострочного

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...