首页 > 解决方案 > 使用多种字符串格式解析挑战

问题描述

我正在尝试解析设备日志,但格式不一致

例子:

Roam candidate# 9 F4:CF:E2:5E:73:3F on channel 161  RSSI: -70

Roam candidate#10 F4:CF:E2:62:02:2F on channel 11  RSSI: -70

我想提取 Mac 地址、通道和 RSSI 值
不幸的是,候选值变为 10 或更高后,空格被省略。

我试图对其进行标记,但我几乎不了解该过程

def clean(string):
    result = ""
    for i,char in enumerate(line):
        if char == " ":
            if string[i+1].isdigit() or string[i+1] == " ":
                continue
        result += char
    return result

def tokenize(string):
    result = []
    previous = 0
    for i,char in enumerate(string):
        if char == " ":
            result.append(string[previous:i])
            previous = i+1
        elif i == len(string)-1:
            result.append(string[previous:i+1])
    return result

我只得到最后一列(RSSI)作为输出

标签: pythonregex

解决方案


使用正则表达式,它会像这样工作:

import re
s1="Roam candidate# 9 F4:CF:E2:5E:73:3F on channel 161 RSSI: -70"
s2="Roam candidate#10 F4:CF:E2:62:02:2F on channel 11 RSSI: -70"

patt= re.compile('(?P<mac>[0-9A-F]{2}(:[0-9A-F]{2}){5}).*?channel (?P<channel>[0-9]*).*?RSSI:\s*(?P<rssi>-?[0-9]*)', re.I)

matcher= patt.search(s1)

print(matcher.group('mac'))
print(matcher.group('channel'))
print(matcher.group('rssi'))

这将返回:

F4:CF:E2:5E:73:3F
161
-70

对于第二行:

F4:CF:E2:62:02:2F
11
-70

推荐阅读