Как использовать функцию "findall ()" в regex для заполнения словаря, если в строке нет совпадений? - PullRequest
0 голосов
/ 24 июня 2019

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

Некоторые строки не содержат совпадений для данного ключа, поэтому функция регулярного выражения findall выдаст пустой список. Поэтому следующий код, где я использую findall и просто адресую 0-й элемент для заполнения словаря, будет работать только тогда, когда строка содержит совпадение для каждого ключа, в противном случае выдается IndexError.

import re

def main():
    my_string = "JC is a 45 year-old male."
    info = {
        "Name": re.findall(r"[A-Z][A-Z]", my_string)[0],
        "Age": re.findall(r"\d{1,2}", my_string)[0],
        "Sex": re.findall(r" male| female", my_string)[0].lstrip()
    }

main()

Этот код, как ожидается, выдает словарь

{
    "Name": "JC",
    "Age": '45',
    "Sex": "male"
}

Код, который у меня действительно работает, выглядит следующим образом:

import re

def main():
    my_string = "JC is a 45 year-old."
    info = {
        "Name": '',
        "Age": '',
        "Sex": ''
    }
    if re.findall(r"[A-Z][A-Z]", my_string):
        info["Name"] = re.findall(r"[A-Z][A-Z]", my_string)[0]
    if re.findall(r"\d{1,2}", my_string):
        info["Age"] = re.findall(r"\d{1,2}", my_string)[0]
    if re.findall(r" male| female", my_string):
        info["Sex"] = re.findall(r" male| female", my_string)[0].lstrip()


main()

И дает словарь

{
    "Name": "JC",
    "Age": "45",
    "Sex": ''
}

Я бы хотел сделать это более кратко. Фактический словарь для того, что я делаю, содержит намного больше ключей, чем только эти 3, и я чувствую, что должен быть лучший способ, чем иметь оператор if для каждого ключа. Спасибо!

1 Ответ

3 голосов
/ 25 июня 2019

Вы можете сохранить ключи и соответствующие им регулярные выражения в виде пар значений ключей в другом словаре:

key_regexes = {
    "Name": r"[A-Z][A-Z]",
    "Age": r"\d{1,2}",
    "Sex": r"\bmale\b|\bfemale\b"
}

А затем переберите ключи словаря, найдите регулярные выражения и сопоставьте каждый из них со строкой ввода. На каждой итерации вы будете добавлять новый ключ в словарь результатов:

result = {}
for key in key_regexes:
    regex = key_regexes[key]
    match = re.search(regex, my_string)
    if match:
        result[key] = match.group(0)
    else:
        result[key] = ''

Обратите внимание, что вы не сможете использовать lstrip, поэтому я изменил регулярное выражение на r"\bmale\b|\bfemale\b".

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