Python正则表达式匹配问题和分组多个组

Python正则表达式匹配问题和分组多个组,python,regex,Python,Regex,我正在尝试分析命令输出,如下所示: 2.437 GHz (Channel 6) Quality=39/70 Signal level=-71 dBm Encryption key:on ESSID:"testssid" IE: IEEE 802.11i/WPA2 Version 1 IE: WPA Version 1 …并基本上将其转换为: channel = 6 quality = "39/70" signal = -71 encryption = true essid = "testss

我正在尝试分析命令输出,如下所示:

2.437 GHz (Channel 6)
Quality=39/70  Signal level=-71 dBm
Encryption key:on
ESSID:"testssid"
IE: IEEE 802.11i/WPA2 Version 1
IE: WPA Version 1
…并基本上将其转换为:

channel = 6
quality = "39/70"
signal = -71
encryption = true
essid = "testssid"
wpa = true
我对正则表达式不是特别在行,但以下是我提取这些字段的尝试:

    m = re.search('Channel (.+)\)', n)
    if m:
            print m.group(1)

    m = re.search('Quality\=(.{5})', n)
    if m:
            print m.group(1)

    m = re.search('level\=(.+)', n)
    if m:
            print m.group(1)

    m = re.search('key\:(.+)', n)
    if m:
            print m.group(1)

    m = re.search('ESSID\:\"(.+?)\"', n)
    if m:
            print m.group(1)
这将产生:

6
39/70
-71 dBm
off
testssid
有两个问题:第一个是“质量”值,因为我有一个硬编码值,如果匹配少于5个字符,该值可能会中断;第二个是“信号值”,我宁愿没有“dBM”部分。我想在这两种情况下,我都希望匹配到下一个空格字符,但无法使用
\s

另外,有一些搜索操作看起来杂乱无章,有没有一种方法可以将这些操作组合起来,或者把它们整理一下

谢谢

re.search('Quality\=(\d+/\d+)', n) #matches a number a slash and a number #/#
re.search('level\=([+-]?\d+)', n) #matches 1 or more numbers so ignore dbm
你可以把它清理干净

patterns = {'quality':'Quality\=(\d+/\d+)',
            'level': 'level\=([+-]?\d+)',
            'key':'key\:(.+)',
            'channel':'Channel (.+)\)'}
body_of_text = open("somefile.txt").read()
results = dict([(key,re.search(regex,body_of_text).group(1)) for  key,regex in patterns.items()])
print results

问题是您总是使用点
而不是适当的字符类(例如,质量项目的
[0-9/]
)。使用更具描述性的模式,您将获得速度和安全性。第二件事,如果信息总是以相同的顺序和格式,您可以尝试在单个模式中提取所有您想要的信息(使用命名捕获)。或者你可以试着逐行阅读你的字符串。(这样做的目的是为了避免搜索每个需要的字段的完整字符串)@casimirithippolyte感谢指针,我现在已经修复了代码片段以使用适当的字符类。谢谢,正则表达式匹配是我最初希望它们与您的修复一起使用的。关于第二位,我得到了一个
ValueError:当我运行它时,太多的值无法解包,有什么想法吗?是的,我搞砸了。。。我编辑了。。。现在应该可以了