【问题标题】:Creating dictionary from strings containing a specific letter从包含特定字母的字符串创建字典
【发布时间】:2021-04-25 17:04:06
【问题描述】:

我正在尝试从包含测试结果的文本文件创建字典。

文本文件如下所示:

NETAPP-MIB::enclTempSensorsCurrentTemp.1 = STRING: 29C (84F) ambient, 36C (96F), 36C (96F), 36C (96F), 36C (96F), 36C (96F), 57C (134F), 37C (98F), 57C (134F), 44C (111F), 59C (138F), 40C (104F), 45C (113F), 58C (136F), 42C (107F)

我的目标是获取所有包含带有字母 C 的数字的结果。 但我设法只得到第一个值

例如这是我得到的:

{'TEST sensor num 0': '29C'}

这是我的代码:

import re

def get_names(ip):
    """Get the server name according the IP address"""
    names = {"TEST": "10.205.110.226", "TEST2": "10.205.111.216"}
    if ip in names.values():
        for key, val in names.items():
            if ip == val:
                return key
    else:
        return f"No Recognized unit {ip}"


def get_temps_servers():
    """ Return A dict mapping from sensor name to sensor value """
    result = {}
    count = 0
    with open("test.txt", "r") as newdata:
        text = newdata.read()
    for ip in online_server:
        name = get_names(ip)
        for c in re.findall(r"^.*?(\d+C)", text, flags=re.M):
            result[f"{name} sensor num {count}"] = c
            count = count + 1
    print(result)
    return result


global online_netapp
online_server = ["10.205.110.226"]

get_temps_servers()

我想要得到的是像这个例子这样的结果:

{'TEST sensor num 0': '29C', 'TEST sensor num 1': '36C', 'TEST sensor num 2': '36C'}

只要有一个带有 C 的数字,就会这样继续下去。

我做错了什么?

【问题讨论】:

  • 正则表达式r"^.*?(\d+C)"只能匹配一个字符串一次,因为^表示字符串的开头,而字符串只有一个开头。应用.findall 并没有帮助,因为只有一个可能的匹配:从字符串开头开始的那个。 .*? 尝试在(\d+C) 之前匹配尽可能少的字符,这要感谢?;但它仍然只匹配一个特定数量的字符。

标签: python dictionary python-re


【解决方案1】:

您的正则表达式不正确,它只查找最多第一个数字 (29c) 匹配。在这里查看https://regex101.com/r/sGVyac/1

尝试像 (\d+C), https://regex101.com/r/A40nuu/1 那样排除插入符号

【讨论】:

    【解决方案2】:

    也许这会让你朝着正确的方向前进:

    import json
    import re
    
    pattern = re.compile(r"\d{2}C")
    long_string = "NETAPP-MIB::enclTempSensorsCurrentTemp.1 = STRING: 29C (84F) ambient, 36C (96F), 36C (96F), 36C (96F), 36C (96F), 36C (96F), 57C (134F), 37C (98F), 57C (134F), 44C (111F), 59C (138F), 40C (104F), 45C (113F), 58C (136F), 42C (107F)"
    d = {
        f"TEST sensor num {index}": temp
        for index, temp in enumerate(re.findall(pattern, long_string))
    }
    
    print(json.dumps(d, indent=2))
    

    输出:

    {
      "TEST sensor num 0": "29C",
      "TEST sensor num 1": "36C",
      "TEST sensor num 2": "36C",
      "TEST sensor num 3": "36C",
      "TEST sensor num 4": "36C",
      "TEST sensor num 5": "36C",
      "TEST sensor num 6": "57C",
      "TEST sensor num 7": "37C",
      "TEST sensor num 8": "57C",
      "TEST sensor num 9": "44C",
      "TEST sensor num 10": "59C",
      "TEST sensor num 11": "40C",
      "TEST sensor num 12": "45C",
      "TEST sensor num 13": "58C",
      "TEST sensor num 14": "42C"
    }
    

    【讨论】:

      【解决方案3】:

      此代码将起作用:

      from sys import stdin
      inputString=stdin.readline().split()
      outputDict=dict()
      for i in range(len(inputString)//2):
          outputDict["test sensor num{}".format(i)] = inputString[2*i]
      
      print(outputDict) 
      

      如果输入为:29C (84F), 36C (96F), 36C (96F)

      输出将是: {'test sensor num0': '29C', 'test sensor num1': '36C', 'test sensor num2': '36C'}

      【讨论】:

        猜你喜欢
        • 2021-12-13
        • 2013-05-27
        • 2015-03-25
        • 1970-01-01
        • 1970-01-01
        • 2021-12-01
        • 2022-07-25
        • 1970-01-01
        相关资源
        最近更新 更多