如何通过正则表达式

时间:2020-03-26 08:52:48

标签: python python-3.x python-2.7

这是我的代码:

我正在尝试使用以下代码将数据插入字典数组中,但无法正确插入。

代码:


test_list = {'module_serial-1': 'PSUXA12345680', 'module_name-1': 'CH1.FM5', 'module_name-2': 'CH1.FM6', 'module_serial-2': 'PSUXA12345681'}

def parse_subdevice_modules(row):
  modules = []
  module = {}

  for k, v in row.items():
    if v:
        if re.match("module_name", k):
            module['name'] = v
        if re.match("module_serial", k):
            module['serial'] = v
            modules.append(module)
            module = {}

  return modules

print(parse_subdevice_modules(test_list))

预期输出: [{'name':'CH1.FM5',serial':'PSUXA12345680'},{'name':'CH1.FM6','serial':'PSUXA12345681'}] 实际输出: ['serial':'PSUXA12345680'},{'name':'CH1.FM6','serial':'PSUXA12345681'}]

在这里运行:https://repl.it/repls/WetSteelblueRange

请注意,由于通过外部API来更改数据test_list的顺序,因此我使用了regex。任何想法将不胜感激。

3 个答案:

答案 0 :(得分:1)

您的代码基于错误的假设,即密钥是有序的,并且序列将始终跟随该名称。此处合适的解决方案是使用dict(实际上是collections.defaultdict使事情变得容易)基于模块号(键中的最后一个“ -N”)来收集和重新组合您感兴趣的值。请注意,您在这里不需要正则表达式-Python字符串已经为该任务提供了必要的操作:

from collections import defaultdict

def parse_subdevice_modules(row):
    modules = defaultdict(dict)

    for k, v in row.items():
        # first get rid of what we're not interested in
        if not v:
            continue
        if not k.startswith("module_"):
            continue

        # retrieve the key number (last char) with 
        # negative string indexing: 
        key_num = k[-1]

        # retrieve the useful part of the key ("name" or "serial")
        # by splitting the string:
        key_name = k.split("_")[1].split("-")[0]

        # and now we just have to store this in our defaultdict
        modules[key_num][key_name] = v

    # and return only the values.
    # NB: in py2.x you don't need the call to `list`, 
    # you can just return `modules.values()` directly

    modules = list(modules.values())
    return modules



test_list = {
    'profile': '', 'chassis_name': '123', 'supplier_order_num': '',
    'device_type': 'mass_storage', 'device_subtype': 'flashblade',
    'module_serial-1': 'PSUXA12345680', 'module_name-1': 'CH1.FM5',
    'module_name-2': 'CH1.FM6', 'rack_total_pos': '',
    'asset_tag': '002000027493', 'module_serial-2': 'PSUXA12345681',
    'purchase_order': '0004530869', 'build': 'Test_Build_for_SNOW',
    'po_line_num': '00190', 'mac_address': '', 'position': '7',
    'model': 'FB-528TB-10X52.8TB', 'manufacturer': 'PureStorage',
    'rack': 'Test_Rack_2', 'serial': 'PMPAM1842147D', 'name': 'FB02'
}

print(parse_subdevice_modules(test_list))

答案 1 :(得分:1)

您也可以这样做。


test_list = {'module_serial-1': 'PSUXA12345680', 'module_name-1': 'CH1.FM5', 'module_name-2': 'CH1.FM6',
             'module_serial-2': 'PSUXA12345681'}


def parse_subdevice_modules(row):
    modules_list = []

    for key, value in row.items():
        if not value or key.startswith('module_name'):
            continue

        if key.startswith('module_serial'):
            module_name_key = f'module_name-{key.split("-")[-1]}'
            modules_list.append({'serial': value, 'name': row[module_name_key]})

    return modules_list


print(parse_subdevice_modules(test_list))

输出:

[{'serial': 'PSUXA12345680', 'name': 'CH1.FM5'}, {'serial': 'PSUXA12345681', 'name': 'CH1.FM6'}]

答案 2 :(得分:0)

您需要检查var pasuxebi = document.querySelectorAll('.pasuxebi'); var checkBtn = document.querySelector('.check'); var nextBtn = document.querySelector('.next'); var startBtn = document.querySelector('.start'); var kitxva = document.querySelector('h3'); var pasuxebiBox = document.querySelector('.pasuxebi'); 是否包含2个元素并将其附加到模块:

 <div class="box">
    <h3 class="none">Question</h3>
<div class="pasuxebi none">
    <div class="pasuxi">pirveli</div>
    <div class="pasuxi">pirveli</div>
    <div class="pasuxi">pirveli</div>
    <div class="pasuxi">pirveli</div>
</div>
<div class="buttons">
    <div class="start">Start</div>
    <div class="check none">Check</div>
    <div class="next none">Next</div>
 </div>

返回:

module