python中使用正则模板匹配结果

正则配置处理类文件

util_tool.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Util Module for functionality shared between modules"""

import re

def combine_dicts(recs):
"""Combine a list of recs, appending values to matching keys"""
if not recs:
return None

if len(recs) == 1:
return recs.pop()

new_rec = {}
for rec in recs:
for k, v in rec.iteritems():
if k in new_rec:
new_rec[k] = "%s, %s" % (new_rec[k], v)
else:
new_rec[k] = v
return new_rec

class CommandParser(object):
"""Object for extending to parse command outputs"""

ITEM_REGEXS = []
ITEM_SEPERATOR = False
DATA = None
MUST_HAVE_FIELDS = []

def __init__(self, data, regexs=None, seperator=None):
self.set_data(data)
self.set_regexs(regexs)
self.set_seperator(seperator)

def set_data(self, data):
self.DATA = data.strip()

def set_regexs(self, regexs):
if regexs:
self.ITEM_REGEXS = regexs

def set_seperator(self, seperator):
if seperator:
self.ITEM_SEPERATOR = seperator

def parse_item(self, item):
rec = {}
for regex in self.ITEM_REGEXS:
matches = [m.groupdict() for m in re.finditer(regex, item)]
mdicts = combine_dicts(matches)
if mdicts:
rec = dict(rec.items() + mdicts.items())
return rec

def parse_items(self):
if not self.ITEM_SEPERATOR:
return [self.parse_item(self.DATA)]
else:
recs = []
for data in self.DATA.split(self.ITEM_SEPERATOR):
rec = self.parse_item(data)
recs.append(rec)
return recs

def parse(self):
if self.ITEM_SEPERATOR:
raise Exception("A seperator has been specified: '%s'. " + \
"Please use 'parse_items' instead")

return self.parse_item(self.DATA)

正则模板文件

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Module for parsing the output of info"""

from util_tool import CommandParser

REGEX_TEMPLATE = r'\n%s\:([\ \t])+(?P<%s>.*)'
class CPUInfoParser(CommandParser):
ITEM_SEPERATOR = "\n\n"
ITEM_REGEXS = [
REGEX_TEMPLATE % (r'Model\ name', 'cpu_model'),
REGEX_TEMPLATE % (r'Socket\(s\)', 'cpu_sockets'),
REGEX_TEMPLATE % (r'Core\(s\)\ per\ socket', 'cpu_cores'),
REGEX_TEMPLATE % (r'CPU\(s\)', 'cpu_processors'),
REGEX_TEMPLATE % (r'CPU\ MHz', 'cpu_frequency'),
]

class CpuName(CommandParser):
ITEM_REGEXS = [
r'(.)*\ (?P<cpu_id>cpu[0-9]+)',
]

class EthernetParser(CommandParser):
ITEM_REGEXS = [
#r'(.)*\ (?P<net>eth[0-9]+)',
r'(.)*\ (?P<net>(((bond)|(eth))[0-9]+))\:',
r'(.)*link/ether\ (?P<mac>([0-9a-fA-F]{2})(([/\s:][0-9a-fA-F]{2}){5}))',
r'(.)*inet\ (?P<ipaddr>(\d{1,3}.){3}\d{1,3})',
r'(.)*Ethernet\ controller\:(?P<controller>.*)',
]



使用方法:
def get_cpu_freq_info(self):
"""
获取CPU每个核的频率并json化返回
:return:
"""
res = {}
try:
data = util.excute_command('ls -l /sys/devices/system/cpu/')
if data:
parser = reg_templates.CpuName(data)
rec = parser.parse()
if rec and isinstance(rec,dict):
if rec.has_key('cpu_id'):
cpuids = str(rec['cpu_id']).split(',')
for ci in cpuids:
if os.path.exists('/sys/devices/system/cpu/'+ str(ci).strip() +'/cpufreq/cpuinfo_cur_freq'):
result = util.excute_command(r'cat /sys/devices/system/cpu/'+ str(ci).strip() +'/cpufreq/cpuinfo_cur_freq')
if str(result).isdigit():
res[str(ci).strip()] = float(result)/1000000
else:
res[str(ci).strip()] = 'N/A'
else:
res[str(ci).strip()] = 'N/A'
return json.dumps(res, encoding="UTF-8", ensure_ascii=True)
except Exception as ex:
logger.exception("get_cpu_freq_info function execute exception:" + str(ex))

转载于:https://www.cnblogs.com/chmyee/p/9888103.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

玩转oracle 11g(8):使用profile管理用户口令

使用profile管理用户口令 概述&#xff1a;profile是口令限制&#xff0c;资源限制的命令集合&#xff0c;当建立数据库的&#xff0c;oracle会自动建立名称为default的profile。当建立用户没有指定profile选项&#xff0c;那么oracle就会将default分配给用户。 1.账户锁定 概述…

RegexDemo6

package cn.zzDemo;/** 转换功能&#xff1a;* String类的public String replaceAll(String regex,* String replacement)使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 */public class RegexDemo6 {public static void main(String[] args) {// 定…

玩转oracle 11g(9):crud操作(亲测)

oracle支持的数据类型 字符类 char 定长 最大2000个字符。 例子&#xff1a;char(10) ‘小韩’前四个字符放‘小韩’&#xff0c;后添6个空格补全 如‘小韩’ varchar2(20) 变长 最大4000个字符。 例子&#xff1a;varchar2&#xff08;10&#xff09; ‘小韩’ oracle分配四个…

自己的路 php,生活感悟的句子:走自己的路,做自己的事

1、生活感悟的句子&#xff1a;当坚强成为你唯一的选择&#xff0c;你才知道自己可以有多坚强。别总把悲伤挂在脸上&#xff0c;每个人都有自己的故事&#xff1b;别把苦恼挂在嘴边&#xff0c;每个人都有自己的烦脑。这世界会打击每一个人。但经历过后&#xff0c;许多人会在受…

项目管理(1):备战pmp

1什么是项目  一家公司被收购  海外建设通讯站点  研究院研发一种新型的药物  中国当局缉拿新疆针刺袭击嫌疑人  野生动物湿地保护区的建立  与朋友一起旅游  房屋装修  ………………请问哪些是项目&#xff1f; 2项目的发展历程  1900年代早期&#xff0c;H…

神经网络中使用Batch Normalization 解决梯度问题

BN本质上解决的是反向传播过程中的梯度问题。 详细点说&#xff0c;反向传播时经过该层的梯度是要乘以该层的参数的&#xff0c;即前向有&#xff1a; 那么反向传播时便有&#xff1a; 那么考虑从l层传到k层的情况&#xff0c;有&#xff1a; 上面这个 便是问题所在。因为网络…

基于matlab的图像分割,基于MATLAB的图像分割算法研究毕业论文

作者姓名 XXX学号指导教师 XX教授学科专业 计算机科学与技术所在学院 计算机学院提交日期结 论数字图像目标分割与提取是数字图像处理和计算机视觉领域中一个备受关注的研究分支&#xff0c;也是图像处理领域的一个经典难题。经过近二十年的不断研究和探讨&#xf…

项目管理(2):备战pmp

1项目阶段与项目生命周期 将每一个项目划分为若干个阶段&#xff08;phases&#xff09;&#xff0c;以便提高管理控制&#xff0c;并提供与该项目实施组织的日常运作之间的联系 这些阶段合在一起称为项目生命周期 项目的生命周期用于定义一个项目的开始和结束 许多组织识别出一…

2018-2019-1 20189213《Linux内核原理与分析》第四周作业

《Linux内核原理与分析》第四周学习总结&#xff1a; 1.课本知识总结&#xff1a; 本章内容并不多&#xff0c;首先是介绍了一些Linux内核源代码的目录结构&#xff0c;并基于Linux内核源代码构造一个简单的操作系统MenuOS&#xff0c;同时在MenuOS启动过程中跟踪分析Linux内核…

matlab窗函数带通滤波器,Matlab结合窗函数法设计数字带通FIR滤波器

Matlab结合窗函数法设计数字带通FIR滤波器 课程设计任务书学生姓名&#xff1a; 专业班级&#xff1a; 通信工程 指导教师&#xff1a; 工作单位&#xff1a; 信息工程学院 题 目:利用 Matlab 仿真软件系统结合窗函数法设计一个数字带通 FIR 滤波器初始条件&#xff1a; 1.《数…

java学习(53):接口的定义和创建

定义一个computer类 package com.company; public interface computer{ /定义公告&#xff0c;静态&#xff0c;常量/ public static final int MAX_NUM5000; /接口中只允许定义公共的抽象方法/ public abstract double couunt(double num1,double num2,char tag); } 定义一个…

PHP动态设计的设计流程,《PHP设计模式介绍》第十四章 动态记录模式

到目前为止&#xff0c;您所看到的这些设计模式大大提高了代码的可读性与可维护性。然而&#xff0c;在WEB应用设计与开发中一个基本的需求与挑战&#xff1a;数据库应用&#xff0c;这些设计模式都没有涉及到。本章与接下来的两章—表数据网关与表数据映射&#xff0c;提供了三…

java学习(54):接口之间的继承

定义一个接口类 //接口 interface interface4 { public abstract void fly(); public abstract void eat(); } //定义一个老鹰类 public class interface3 implements interface4{ public void fly(){ System.out.println(“我是老鹰&#xff0c;我会飞”); } public void eat…

php addall,深入解析thinkphp中的addAll方法

原因&#xff1a;在做中控系统中遇到了一个给用户批量分配角色的问题&#xff0c;刚开始想到的是循环插入&#xff0c;但立马给否定了&#xff0c;循环操作数据库开发者的大忌啊&#xff0c;于是查找手册找到数据写入看到批量操作&#xff1a;addAll(),测试成功&#xff0c;以为…

Java排查问题随笔

常言道&#xff1a;“好记性不如烂笔头”&#xff0c;确实很有道理。在日常工作中&#xff0c;偶尔处理下线上问题还是很常见的&#xff0c;经常出现的情况就是忘记一些常用命令&#xff08;套路&#xff09;的用法了&#xff0c;因此整理下来非常用必要&#xff0c;以便关键时…

java学习(55):定义一个抽象类的继承

不同的是定义一个抽象类先 //抽象类 public abstract class interface4 { public abstract void fly(); public abstract void eat(); } //定义老鹰类继承 /定义一个老鹰类 public class interface3 extends interface4{ public void fly(){ System.out.println(“我是老鹰&…

可持久化线段树学习笔记

可持久化线段树&#xff0c;即主席树。 每次修改的时候不修改原来的节点&#xff0c;暴力建新节点&#xff0c;充分运用了函数式编程的思想。 模板题&#xff1a;给定一个数列&#xff0c;\(m\) 次询问求区间 \([l,r]\) 内的第 \(k\) 大。 利用前缀和思想&#xff1a; #include…

wordpress functions.php 在哪,在functions.php中定义变量并在WordPress中的函数钩子中访问它们...

我想更详细地了解Wordpress结构.正如我所知,使用全局关键字并不是一个好主意.这是我想要完成的&#xff1a;Inside functions.php$affID 12334; //defining a variableadd_shortcode(affiliate_link, function() {$newLink https://example.com?id . $affID;return $newLink…

java学习(56):接口之间的继承续

//定义一个接口&#xff0c;里面放置多个方法 public interface CountManagement { double count(double n,double m,char tag); double count(double up,double down,double h); double eqAax(double num1,double num2); } //定义一个接口&#xff0c;里面需要实现多个方法 pu…

[UE4]单机游戏改网络游戏,不完全清单

把Actor的复制打开中腰数据的复制打开&#xff0c;且只在服务器修改&#xff08;比如角色属性血量&#xff09;需要同步的Actor&#xff0c;不在客户端Spawn客户端的操作&#xff0c;先报告到服务器&#xff0c;服务器再广播到所有客户端某些逻辑只在服务器运行&#xff08;比如…