尝试使用python从CMD输出中解析SSID、BSSID和Signal的值。让我困惑的是,如何每次都获得这三个值,并将其存储在列表中。我可以对每一行都这样做…
import subprocess, re
cmd = subprocess.Popen('netsh wlan show networks mode=BSSID',
shell=True, stdout=subprocess.PIPE)
for line in cmd.stdout:
if "BSSID" in line:
print re.search(r'([0-9A-F]{2}[:-]){5}([0-9A-F]{2})', line, re.I).group()
但问题是,我可以理解这不是一个好的做法。我试图实现的是在列表中包含SSID、BSSID和Signal,这样我就可以打印列表中的任何信息。例如,从我的列表中打印第二个接入点的BSSID,或者对于APS中的AP:打印SSID。
任何帮助都将不胜感激!
以下是如何将输出解析为字典列表的方法:
import subprocess
ssid = {}
ssids = []
cmd = subprocess.Popen('netsh wlan show networks mode=BSSID',
shell=True, stdout=subprocess.PIPE)
for line in cmd.stdout:
l = map(lambda x: x.strip(), line.strip().split(":"))
if len(l) > 1:
key, value = l[0], l[1]
if key.startswith("SSID"):
key = "name"
if ssid:
ssids.append(ssid)
ssid = {}
ssid[key] = value
if "name" in ssid:
ssid[key] = value
ssids.append(ssid)
# example of how to use ssids, list of ssid dictionaries
for ssid in ssids:
print ssid["name"], ssid["Encryption"]
此外,在原始代码中,您使用的是.group()
,它将返回行的整个匹配部分。
您可以使用带有位置参数的group()
从正则表达式中获取该组。例如,group(2)
将返回正则表达式中的第二项([0-9A-F]{2})
。
要返回一个项目元组,只需使用groups()
就可以将其附加到列表中。
例如,假设您的正则表达式是正确的,请更改此部分;
mylist=list()
for line in cmd.stdout:
if "BSSID" in line:
mylist.append(re.search(r'([0-9A-F]{2}[:-]){5}([0-9A-F]{2})', line, re.I).groups())
在上面的列表之后,mylist将包含一个元组列表,其中包含每行的摘录。