如何有选择地忽略python正则表达式中的字符串?

如何有选择地忽略python正则表达式中的字符串?,python,beautifulsoup,loggly,Python,Beautifulsoup,Loggly,我已经为我的路由器编写了一个相当基本的系统监视器,用于跟踪信号何时下降(以及当时发生的所有统计数据),因为非常优秀的routerstatslite无法收集我需要的所有信息 这里是要点,但我想在将数据上传到loggly之前对其进行清理,以便根据需要删除db和mbps后缀 当我把它直接放到dict中时,我想在找到它时丢弃Mbps或dB,但很明显,我得到的是行不通的。 如果我可以简单地从提取字段时得到的70-80多个状态行中删除两个字符串,这会更整洁,但是这是不可能的吗 干杯 脚本标记的示例输入:

我已经为我的路由器编写了一个相当基本的系统监视器,用于跟踪信号何时下降(以及当时发生的所有统计数据),因为非常优秀的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'}