-1
votes

Extraire une chaîne de nombres spécifique d'une ligne

J'accède à un fichier journal comportant des lignes telles que: xxx

Je veux analyser le fichier et extraire l'adresse IP à l'intérieur des crochets après la phrase ("Cartographie inverse Vérification .... "Et avant le mot" Échec ")

Je suis nouveau dans des expressions régulières et je ne peux pas comprendre l'étape.

aussi, adresse IP Adresse de chaque octet Être <100 ou> 100 est déroutant comme je ne peux pas utiliser [0-9 [0-9] (truc fixe)

S'il vous plaît aidez-moi à extraire cette adresse IP à l'aide de n'importe quelle méthode. < / p>


3 commentaires

Questions qui demandent à "Donnez-moi une regex qui fait x" sans tentative est hors tentative sur le débordement de la pile.


Dupliqué possible de Utilisation-A-Regex-to-Match-IP -Anadresses-in-Python


Utilisez REGEX101.COM pour affiner cette fuite et ajouter [] littéraux.


4 Réponses :


2
votes

Cette regex devrait fonctionner: xxx

\ s signifie aucun caractère de blanchissage, j'utilise avec le quantificateur + Obtenez toute l'URL avec l'adresse IP, puis pour capturer le groupe à l'intérieur des crochets, j'utilise ce groupe:

([\]]] +) . Il ne peut capturer que possible autant que possible les caractères ] , afin de capturer toute l'adresse IP.


1 commentaires

Ça a marché. Merci beaucoup. (Upvoted mais vous ne verrez pas de problèmes de réputation de Coz ici).



0
votes

i Woudl Faites-le de la manière suivante: xxx

Notez que j'ai utilisé appelé r -string, afin que je puisse utiliser un seul \ comme évasion sans avoir besoin de l'échapper. Mon motif comprend 3 parties principales:

  • (? <= \ [) est une affirmation de longueur zéro, ce qui signifie: vérifier s'il y a [ avant la correspondance, [ doit être échappé comme il a une signification spéciale
  • \ d {1,3} \. \ d {1,3} \. \ d {1,3} \. \ d {1,3} est quatre chiffres constitués de 1 à 3 chiffres ( \ d ) cisaillé par des points (. - une nouvelle évacuation est nécessaire, comme . a une signification particulière)
  • (? = \ \]) est une affirmation de longueur zéro, Signification: Vérifiez s'il y a ] après la correspondance, ] doit être échappé aussi.

0 commentaires

0
votes
import re

regex = r"\[[0-9.]+\] failed"

test_str = ("May  1 07:39:30 example-server sshd[61362]: reverse mapping checking getaddrinfo for 37-115-223-100.broadband.kyivstar.net [37.115.223.100] failed - POSSIBLE BREAK-IN ATTEMPT!\n\n"
    "May  1 07:42:02 example-server sshd[61698]: reverse mapping checking getaddrinfo for 234.10.13.218.broad.fs.gd.dynamic.163data.com.cn [218.13.10.234] failed - POSSIBLE BREAK-IN ATTEMPT!")

matches = re.finditer(regex, test_str, re.MULTILINE)
mapping = [ (' failed', ''), ('[', ''), (']', '') ]


for matchNum, match in enumerate(matches, start=1):
    my_string = match.group()
    for k, v in mapping:
        my_string = my_string.replace(k, v)    
    print ("IP : {match}".format(match = my_string))

0 commentaires

0
votes

Je suis personnellement contre les regextes dans de tels cas simples, Python a une méthode brillante String.split () qui peut faire fonctionner plus rapidement et plus simple. Pourquoi juste ne pas xxx

c'est simple - logstr.split ("Vérification de la cartographie inverse", 1) vous donne deux chaînes - avant "Vérification de la cartographie inverse" avec Index 0 et après - avec index 1. Je définis le comptage de fractionnement sur 1 pour conseiller Python Ne recherchez plus de chaîne. Ensuite, nous prenons de la deuxième série par [1] et la séparez à nouveau par '[', d'obtenir des choses après [avec [1], puis divisée par ']' Obtenir [0] cette fois-ci comme IP avant]. C'est tout


0 commentaires