终端读取WiFi扫描信息时含空格SSID的字符串拆分数组解决方案咨询
解决WiFi扫描输出的字段拆分问题(含带空格的SSID)
你遇到的核心问题其实是终端WiFi扫描结果的排版特性:这类输出是固定列宽对齐的格式,既不是用制表符分隔,也不是单纯靠多空格区分字段——所以按空格拆分或制表符拆分都会在SSID含空格时失效。下面给你两种可靠的解决思路:
方法1:按固定列位置截取(最通用可靠)
终端的这类输出表头和内容行是严格按列宽对齐的,每个字段都有固定的起始和结束位置。我们可以先解析表头的字段位置,再对每一行数据按位置截取,完美规避SSID含空格的问题。
示例代码(Python)
# 模拟从终端获取的WiFi扫描输出 wifi_scan_output = """IN-USE SSID MODE CHAN RATE SIGNAL BARS SECURITY * example Infra 1 130 Mbit/s 71 ▂▄▆_ WPA2 example2 Infra 10 130 Mbit/s 65 ▂▄▆_ WPA2 * im here Infra 6 270 Mbit/s 82 ▂▄▆█ WPA3""" # 预处理:拆分并过滤空行 lines = [line.strip() for line in wifi_scan_output.splitlines() if line.strip()] header = lines[0] data_rows = lines[1:] # 定义所有字段名 field_names = ["IN-USE", "SSID", "MODE", "CHAN", "RATE", "SIGNAL", "BARS", "SECURITY"] # 计算每个字段的起始/结束索引范围 field_ranges = [] for idx, field in enumerate(field_names): start = header.index(field) # 最后一个字段的结束位置是字符串末尾 if idx == len(field_names) - 1: end = len(header) else: end = header.index(field_names[idx + 1]) field_ranges.append((start, end)) # 解析每一行数据 wifi_results = [] for row in data_rows: entry = {} for name, (start, end) in zip(field_names, field_ranges): # 截取对应列并去除首尾空格 entry[name] = row[start:end].strip() wifi_results.append(entry) # 验证结果(打印每个条目) for item in wifi_results: print(f"IN-USE: {item['IN-USE']}, SSID: '{item['SSID']}', SECURITY: {item['SECURITY']}")
运行后,带空格的SSIDim here会被完整解析,不会被拆分成多个字段。
方法2:正则表达式匹配(适合格式稳定的场景)
如果你的WiFi输出格式非常固定(比如MODE始终是Infra、速率格式不变),可以用正则表达式匹配每个字段的模式:
示例正则(Python)
import re pattern = r'^(\*?)\s*(.+?)\s+(Infra)\s+(\d+)\s+(\d+\s+Mbit/s)\s+(\d+)\s+([▂▄▆█_]+)\s+(\w+)$' wifi_results = [] for row in data_rows: match = re.match(pattern, row) if match: entry = { "IN-USE": match.group(1).strip(), "SSID": match.group(2).strip(), "MODE": match.group(3), "CHAN": match.group(4), "RATE": match.group(5), "SIGNAL": match.group(6), "BARS": match.group(7), "SECURITY": match.group(8) } wifi_results.append(entry)
这种方法的缺点是:如果输出格式有变化(比如MODE出现其他值),正则就会失效,所以通用性不如方法1。
为什么之前的方法失效?
- 按多空格拆分:当SSID包含空格时,会把SSID拆成多个部分,破坏字段对应关系。
Split("\t"):终端输出的对齐不是用制表符,而是用空格填充到固定列宽,所以找不到制表符拆分点。
内容的提问来源于stack exchange,提问作者Three Strikes
相关产品推荐
相关产品推荐

