[英]How to use regex's “findall()” function to populate a dictionary when it's possible for there to be no matches in the string?
我想使用正則表達式在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
語句。 謝謝!
您可以將鍵及其各自的正則表達式作為鍵值對存儲在另一個字典中:
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"
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.