【问题标题】:How to make dictionary from this list with regexes?如何使用正则表达式从此列表中制作字典?
【发布时间】:2020-10-16 22:46:32
【问题描述】:

我需要用正则表达式做这样的事情:

'host': '146.204.224.152',
'user_name': 'feest6811',
'time': '21/Jun/2019:15:45:24 -0700',
'request': 'POST /incentivize HTTP/1.1'

我已经有了四个列表:

host = re.findall("(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})",logdata)
user_name = re.findall("[a-z]{1,100}\d{4}\ ", logdata) 
time = re.findall("\d{2}/[A-z]{3}/\d{4}:\d{2}:\d{2}:\d{2} -\d{4}", logdata)
request = re.findall("[A-Z]{1,30}\ /[\w/+]{1,100} [HTTP/]{5}\d{1}\.\d{1}", logdata)

然后尝试用这种方式制作字典:

result = {'host': host, 'user_name': user_name, 'time': time, 'request': request}

但我得到了这个:

'host': ['146.204.224.152',
  '197.109.77.178',
  '156.127.178.177',
  '100.32.205.59',
  '168.95.156.240',
  '71.172.239.195',
  '180.95.121.94',
  '144.23.247.108',
  '2.179.103.97',
  '241.114.184.133',
...]
'user_name': ['feest6811 ',
  'kertzmann3129 ',
  'okuneva5222 ',
  'ortiz8891 ',
  'stark2413 ',
  'dooley1853 ',
  'mohr6893 ',
  'auer7552 ',
  'lind8584 ',
  'tromp8355 ',
  'keebler1423 ',
  'klein8508 ',
  'gusikowski9864 ',
  'medhurst2732 ',
  'dubuque8645 ',
...] 

以此类推其他变量。如何以它为例?

【问题讨论】:

  • 您正在使用 re.findall 每个变量,这将获得每个模式的所有结果。您可以创建一个包含 4 个捕获组的单一模式。

标签: python regex list dictionary


【解决方案1】:

您需要并行遍历 findall 结果。您所做的是创建一个包含整个列表的大型 dict 条目。

elist = []    # short for entry list
for ehost, euser, etime, ereq in zip(host, user_name, time, request):
    elist.append(
        {"host": ehost,
         "user_name": ename,
         "time": etime,
         "request": ereq
        }

也许更让您感到舒适的是使用一个通用索引,并从每个列表中提取每个对应的值:

for i in range(len(host)):
    elist.append(
        {"host": host[i],
         "user_name": user_name[i],
         "time": time[i],
         "request": req[i]
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 2018-03-21
    相关资源
    最近更新 更多