当字符串中可能没有匹配项时,如何使用正则表达式的“ findall()”函数填充字典?

时间:2019-06-24 20:55:45

标签: python regex

我想使用正则表达式在python中填充字典的值。我使用正则表达式是因为我要从中提取数据的字符串的原始格式在字符串之间并不一致,但是字符串中的相关数据很容易找到并且格式一致。

某些字符串不包含给定键的匹配项,因此regex的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": ''
}

我想以一种更简洁的方式做到这一点。我正在做的事情的实际词典包含的键要比这三个要多得多,我觉得必须有一个更好的方法,而不是为每个键都使用if语句。谢谢!

1 个答案:

答案 0 :(得分:3)

您可以将键及其相应的正则表达式作为键值对存储在另一个字典中:

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"的原因。