python - 使用多种字符串格式解析挑战
问题描述
我正在尝试解析设备日志,但格式不一致
例子:
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)作为输出
解决方案
使用正则表达式,它会像这样工作:
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
推荐阅读
- windows - 通过 CMD 执行 powershell 字符串
- sqlite - SQLiteNetExtensions 多个相同类型的多对一关系
- docker - 使用覆盖网络部署 Docker 堆栈 - 行为不一致
- r - R中按组在数据表上的日期范围内滚动总和
- javascript - 根据值对javascript中的对象键进行排序
- smartcontracts - 验证过程如何在 RIDE 上进行?将脚本附加到帐户后会发生什么?
- azure-functions - 从函数应用访问虚拟网络中的 Cosmos DB
- php - 如何防止 Yii CGridView 过滤器发生变化?
- python - Flask跨域不与命名空间一起工作
- semantic-ui - 防止在显示语义 ui 模式时隐藏正文滚动条