Ich mache meine eigene Paketerfassung, um das Netzwerk zu studieren. Ich habe den Prozess des Parsens des Ethernet-Frames darin geschrieben. Wenn die vom Socket empfangenen Rohdaten in eine Zeichenfolge konvertiert werden, lautet die MAC-Adresse Es wird ohne das eingefügte Semikolon ":" erfasst.
Ich möchte ein Semikolon einfügen
000c29ecc97a
↓ Ich möchte das tun ↓
00:0c:29:ec:c9:7a
Da es sich um eine Zeichenfolgenliste handelt, sollte ich sie in Unterlisten mit jeweils 2 Zeichen aufteilen und mit ":" verbinden? Als ich es googelte, fand ich zip (\ * [iter (s)] * n) als eine Technik, um es in Unterlisten mit n Zeichen zu unterteilen.
Fügen Sie ein Semikolon mit split und join ein
>>> s = '000c29ecc97a'
>>> zip(*[iter(s)]*2)
>>> [('0', '0'), ('0', 'c'), ('2', '9'), ('e', 'c'), ('c', '9'), ('7', 'a')]
# ":"Verbinden mit!
>>> ':'.join(map(''.join, zip(*[iter(s)]*2)))
'00:0c:29:ec:c9:7a'
':'.join(map(''.join, zip(*[iter(s)]*2)))Aber***Es ist schwer zu lesen***。
Es ist eine gute Technik, aber unangenehm, weil es schwer zu verstehen ist, ohne es zu wissen.
Das nächste, was ich mir ausgedacht habe, war, wie ich es durch einen regulären Ausdruck ersetzen kann.
#### **`Fügen Sie ein Semikolon mit regulärem Ausdruck ein`**
```pycon
>>> import re
>>> s = '000c29ecc97a'
>>> raw_mac_ptn = r'([0-9A-F]{2})(?!$)'
>>> mac_addr = re.sub(raw_mac_ptn, r'\1:', s)
>>> mac_addr
'00:0c:29:ec:c9:7a'
Ich frage mich, ob dieser leichter zu sehen ist. Negative Vorausschau (?! $) Ist wichtig, damit am Ende kein ":" eingefügt wird.
Recommended Posts