A melhor expressão regular para correspondência de endereços IP nos arquivos de log depende do nível de rigor que você precisa. Um regex verdadeiramente rigoroso para todos os endereços IPv4 e IPv6 válidos é extremamente complexo e, sem dúvida, não vale o esforço para a maioria das análises de log. Aqui estão algumas opções, progredindo de mais simples a mais complexo:
Opção 1:IPv4 simples (bom para verificações rápidas e sujas) Este regex funciona bem para os endereços IPv4 mais comuns, mas pode perder alguns casos de borda (como endereços com zeros líderes em octetos):
`` `regex
\ b (?:\ d {1,3} \.) {3} \ d {1,3} \ b
`` `
* `\ b`:limite da palavra para evitar correspondências parciais (por exemplo, correspondência" 192.168.1.100 "dentro" 192.168.1.1000 ").
* `(?:\ d {1,3} \.)`:Grupo não capturado correspondendo a um a três dígitos, seguido de um ponto (repetido três vezes).
* `\ d {1,3}`:um a três dígitos para o último octeto.
Opção 2:IPv4 um pouco mais robusto Esta versão adiciona alguma validação para impedir que os números superiores a 255:
`` `regex
\ b (? :(?:25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9]?) \.) {3} (?:25 [0-5] | 2 [0-4] [0-9] |
`` `
* `(?:25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9]?)`:Isso corresponde a números de 0 a 255. Ele lida com as diferentes possibilidades:
* `25 [0-5]`:números de 250 a 255.
* `2 [0-4] [0-9]`:números de 200 a 249.
* `[01]? [0-9] [0-9]?`:Números de 0 a 199 (liderança opcional 0 ou 1).
Opção 3:IPv4 e IPv6 (muito complexo) Um regex que lida com precisão * os endereços * IPv4 e IPv6 é significativamente mais complicado. Geralmente, é recomendável usar bibliotecas dedicadas ao endereço IP dedicado, em vez de confiar apenas na Regex para esta tarefa. No entanto, se você absolutamente deve usar um regex, esteja preparado para uma expressão longa e pesada. Você encontrará exemplos on -line, mas eles não são facilmente legíveis ou sustentáveis.
Recomendação: Para a maioria das análises de arquivos de log,
Opção 2 fornece um bom equilíbrio entre precisão e simplicidade. Se você precisar lidar com endereços IPv6, use uma biblioteca de análise de endereço IP dedicado em sua linguagem de programação (o módulo `ipaddress` do Python é um bom exemplo). Expressões regulares não são a ferramenta ideal para esta tarefa complexa.
Exemplo de uso (python): `` `Python
importar re
log_line ="192.168.1.100 - - [10/Oct/2023:13:55:36 +0000] \" get/http/1.1 \ "200 1024"
padrão =r "\ b (? :(?:25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9]?) \.) {3} (?:25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9]?
Match =re.search (padrão, log_line)
Se a correspondência:
ip_address =match.group (0)
imprimir (endereço IP f "encontrado:{ip_address}")
`` `
Lembre -se de adaptar o regex e o código ao seu formato de arquivo de log específico e linguagem de programação.