Me gustaría dividir la cadena al diccionario. La cadena se toma usando

$ sudo btmgmt find |grep rssi |sort -n |uniq -w 33

Y mi resultado es

hci0 dev_found: 40:43:42:B3:71:11 type LE Random rssi -53 flags 0x0000 
hci0 dev_found: 44:DA:5F:EA:C6:CF type LE Random rssi -78 flags 0x0000

El objetivo es crear un diccionario donde la clave es la dirección MAC y el valor es el valor rssi

dict = {
    "40:43:42:B3:71:11": "-53 ",
    "44:DA:5F:EA:C6:CF": "-78",
   }

Intenté muchas funciones de reemplazo para reemplazar estas cadenas para vaciar cadenas:

  • hci0 dev_found:
  • tipo
  • LE
  • Aleatoria
  • rssi

Pero debe ser una forma más limpia y mejor de hacer este diccionario y no veo esta solución.

¿Alguna idea?

2
derirative23 30 sep. 2019 a las 20:41

4 respuestas

La mejor respuesta

Si cada línea tiene la misma construcción, puede usar split() para dividir el texto en líneas y luego dividir cada línea en "palabras" que puede usar para crear elementos en el diccionario:

s = """
hci0 dev_found: 40:43:42:B3:71:11 type LE Random rssi -53 flags 0x0000 
hci0 dev_found: 44:DA:5F:EA:C6:CF type LE Random rssi -78 flags 0x0000
"""

d = dict()

for line in s.split('\n'):
    line = line.strip() # clear spaces and enters
    if line: # skip empty lines
        words = line.split(' ')
        d[words[2]] = words[7]

print(d)        
1
furas 30 sep. 2019 a las 17:59

Puede usar re.findall con lookaheads regex y lookbehinds:

import re
s = """
hci0 dev_found: 40:43:42:B3:71:11 type LE Random rssi -53 flags 0x0000 
hci0 dev_found: 44:DA:5F:EA:C6:CF type LE Random rssi -78 flags 0x0000
"""
d = dict([re.findall('(?<=dev_found:\s)[A-Z\d:]+|[\-\d]+(?=\sflags)', i) for i in filter(None, s.split('\n'))])

Salida:

{'40:43:42:B3:71:11': '-53', '44:DA:5F:EA:C6:CF': '-78'}
0
Ajax1234 30 sep. 2019 a las 17:44

Debido a que las columnas están separadas por espacios, puede usar el método de división:

s = """hci0 dev_found: 40:43:42:B3:71:11 type LE Random rssi -53 flags 0x0000 
hci0 dev_found: 44:DA:5F:EA:C6:CF type LE Random rssi -78 flags 0x0000"""

sdic = {}

for line in s.split('\n'):
    column = line.split(' ')
    sdic[column[2]] = column[7]

print(sdic)
0
Flostian 30 sep. 2019 a las 17:56

Entrada: un archivo con líneas dadas

import re
d = dict()
c1 = re.compile("((\d|\w){1,2}:){5}(\d|\w){1,2}")
c2 = re.compile(r"(-\d{2}) flags")
with open("your_saved_lines.txt") as fh:
  for l in fh.readlines():
    m1 = c1.search(l)
    m2 = c2.search(l) or "NA"
    if m1:
      d[m1.group()] = m2.group(1)
print(d)

Salida: {'40:43:42:B3:71:11': '-53', '44:DA:5F:EA:C6:CF': '-78'}

0
Leo Skhrnkv 30 sep. 2019 a las 18:40
58172752