我已经为我的路由器编写了一个相当基本的系统监视器来跟踪信号何时下降(以及当时发生的所有统计信息),因为非常出色的 routerstatslite 不会收集我需要的一切。
这是要点,但我想在将数据上传到日志之前对其进行清理,以便我可以根据需要删除 db 和 mbps 后缀
https://gist.github.com/scottharman/6ca07a7c46ca09de3e3b2f0a5094d86e
script = stats.findAll('script')[1]
pattern = re.compile('(w+)="(.*?)Mbps|dB"')
fields = dict(re.findall(pattern, script.text))
clean_fields = { k:v.strip() for k, v in fields.iteritems()}
if old_fields != clean_fields:
logger.info(json.dumps(clean_fields))
old_fields = clean_fields
print clean_fields
sleep(5)
当我把它直接放入字典中时,我想在找到时丢弃 Mbps 或 dB,但显然我所拥有的是行不通的。如果我可以在提取字段时简单地从 70-80 个奇数状态行中删除两个字符串,那就更整洁了,但这是不可能的吗?
干杯
脚本标记的示例输入:
var conn_down=" 13.35 Mbps";
var conn_up=" 0.82 Mbps";
var line_down=" 34.60 dB";
var line_up=" 19.70 dB";
var noise_down=" 6.10 dB";
var noise_up=" 6.50 dB";
var sys_uptime="74523";
var lan_status="Link up";
var lan_txpkts="1294024";
var lan_rxpkts="2256747";
var lan_collisions="0";
var lan_txbs="10004";
var lan_rxbs="35259";
var lan_systime="74523";
然后处理后的数据如下所示:
u'noise_up': u'6.50 dB', u'lan_rxbs': u'35259', u'an_rxpkts': u'2857867', u'bgn_status': u'600M', u'lan_status0': u'100M/Full',
u'lan_status3': u'1000M/Full', u'lan_status2': u'100M/Full', u'conn_up': u'0.82 Mbps',
您可以使用可选的非捕获组来匹配' Mbps'
或' dB'
:
import re
import pprint
s = '''var conn_down=" 13.35 Mbps";
var conn_up=" 0.82 Mbps";
var line_down=" 34.60 dB";
var line_up=" 19.70 dB";
var noise_down=" 6.10 dB";
var noise_up=" 6.50 dB";
var sys_uptime="74523";
var lan_status="Link up";
var lan_txpkts="1294024";
var lan_rxpkts="2256747";
var lan_collisions="0";
var lan_txbs="10004";
var lan_rxbs="35259";
var lan_systime="74523";'''
pattern = re.compile(r'(w+)="s*(.*?)(?:sMbps|sdB)?"')
fields = dict(re.findall(pattern, s))
pprint.pprint(fields)
输出:
{'conn_down': '13.35',
'conn_up': '0.82',
'lan_collisions': '0',
'lan_rxbs': '35259',
'lan_rxpkts': '2256747',
'lan_status': 'Link up',
'lan_systime': '74523',
'lan_txbs': '10004',
'lan_txpkts': '1294024',
'line_down': '34.60',
'line_up': '19.70',
'noise_down': '6.10',
'noise_up': '6.50',
'sys_uptime': '74523'}
在上面(w+)=
捕获一个或多个字母数字字符,后跟 =
。 "s*
匹配引号后跟零个或多个空格。 (.*?)
非贪婪地捕获任何文本,(?:sMbps|sdB)?
是可选的非捕获组,与' Mbps'
或' dB'
匹配。请参阅正则表达式 101 演示。
尝试将模式更改为:
pattern = re.compile('(w+)="s*(.+?)s*(?:Mbps|dB)?"')
我认为如果我正确理解你想要什么,那会起作用。它基本上是你现在拥有的,但有一个非捕获部分用于"Mbps/dB",因此单位不会包含在匹配中。