Распознавание образов Python IPv6 Regex - PullRequest
0 голосов
/ 14 октября 2019

Я пытался распознать IPv6-адреса из строк и заменить их другим текстом.

В настоящее время я использую следующий шаблон:

ipv6_pattern = re.compile(r'(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|'
                          r'([0-9a-fA-F]{1,4}:){1,7}:|'
                          r'([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|'
                          r'([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|'
                          r'([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|'
                          r'([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|'
                          r'([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|'
                          r'[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|'
                          r'fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|'
                          r'::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|'
                          r'1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|'
                          r'(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|'
                          r'([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|'
                          r'(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|'
                          r'(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))')

Работает (почти) нормально.

Пример:

2001 :: 85a3: 0000: 0000: 8a2e -> CHANGED85a3: 0000: 0000: 8a2e

Очевидно, я мог бы это исправить, добавив начало и конецстроковых тегов по обеим сторонам шаблона регулярного выражения, чтобы он охватывал всю строку, а не только ее часть.

Однако это добавляет новую проблему, поскольку существуют случаи, когда шаблон, такой как

STARTOFSTRING2001::85a3:0000:0000:8a2e
STARTOFSTRING2001::85a3:0000:0000:8a2eENDOFSTRING
2001::85a3:0000:0000:8a2eENDOFSTRING

и если я добавлю метки начала и конца строки, эти случаи не будут охвачены. Мой вопрос заключается в следующем:

Есть ли «лучший» шаблон, который я могу использовать, который позволяет мне перехватывать весь адрес IPv6, а также случаи, когда по обе стороны от него есть текст.

...