如何有选择地忽略python正则表达式中的字符串?
我已经为我的路由器编写了一个相当基本的系统监视器,用于跟踪信号何时下降(以及当时发生的所有统计数据),因为非常优秀的routerstatslite无法收集我需要的所有信息 这里是要点,但我想在将数据上传到loggly之前对其进行清理,以便根据需要删除db和mbps后缀 当我把它直接放到dict中时,我想在找到它时丢弃Mbps或dB,但很明显,我得到的是行不通的。 如果我可以简单地从提取字段时得到的70-80多个状态行中删除两个字符串,这会更整洁,但是这是不可能的吗 干杯 脚本标记的示例输入:如何有选择地忽略python正则表达式中的字符串?,python,beautifulsoup,loggly,Python,Beautifulsoup,Loggly,我已经为我的路由器编写了一个相当基本的系统监视器,用于跟踪信号何时下降(以及当时发生的所有统计数据),因为非常优秀的routerstatslite无法收集我需要的所有信息 这里是要点,但我想在将数据上传到loggly之前对其进行清理,以便根据需要删除db和mbps后缀 当我把它直接放到dict中时,我想在找到它时丢弃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',
尝试将模式更改为:
pattern = re.compile('(\w+)="\s*(.+?)\s*(?:Mbps|dB)?"')
如果我正确理解你的需求,我想那会有用的。这基本上是您现在拥有的,但是有一个“Mbps/dB”的非捕获部分,因此单位不会包括在匹配中。您可以使用可选的非捕获组来匹配
'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'
匹配。请参见。您可以提供示例输入和预期输出吗?Hi@niemmi-为了清晰起见,刚刚添加了该组,您希望输出看起来像u'noise\u up':u'6.50',u'conn\u'up':u'0.82',…
?显然,我所得到的不是ork
。不明显。这里的实际问题是什么?是的!这是我一直在寻找的语法!我不知道如何让它工作,因为每次我尝试它时,它都不会抛出匹配的东西-所以假设它根本就不起作用。非常感谢!是的,有点-我也想捕获链接状态,因为我将要转储一个r将日志滚到dropbox和loggly,这样,如果辍学者继续退学,我可以向我的电信公司发送一些东西worse@Scott哦,对不起!我完全没有注意到您试图捕获非数字数据的事实。我更新了我的答案,但似乎niemmi已经给了您所需的。祝您的项目好运。
{'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'}