Je fais ma propre capture de paquets pour étudier le réseau. J'écrivais le processus d'analyse de la trame Ethernet. Lorsque les données brutes reçues par le socket sont converties en chaîne de caractères, l'adresse MAC est Il est acquis sans le point-virgule ":" inséré.
Je veux insérer un point-virgule
000c29ecc97a
↓ Je veux faire ça ↓
00:0c:29:ec:c9:7a
Puisqu'il s'agit d'une liste de chaînes de caractères, dois-je la diviser en sous-listes de 2 caractères chacune et la joindre avec ":"? Quand je l'ai googlé, j'ai trouvé zip (\ * [iter (s)] * n) comme technique pour le diviser en sous-listes à n caractères.
Insérer un point-virgule avec fractionnement et jointure
>>> s = '000c29ecc97a'
>>> zip(*[iter(s)]*2)
>>> [('0', '0'), ('0', 'c'), ('2', '9'), ('e', 'c'), ('c', '9'), ('7', 'a')]
# ":"Se connecter avec!
>>> ':'.join(map(''.join, zip(*[iter(s)]*2)))
'00:0c:29:ec:c9:7a'
':'.join(map(''.join, zip(*[iter(s)]*2)))Mais***C'est difficile à lire***。
C'est une bonne technique, mais c'est désagréable car c'est difficile à comprendre sans le savoir.
La prochaine chose que j'ai trouvée était de savoir comment le remplacer par une expression régulière.
#### **`Insérer un point-virgule avec une expression régulière`**
```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'
Je me demande si celui-ci est plus facile à voir. Look-ahead négatif (?! $) Est important pour que ":" ne soit pas inséré à la fin.
Recommended Posts