J'accède à un fichier journal comportant des lignes telles que: 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 ") p> Je suis nouveau dans des expressions régulières et je ne peux pas comprendre l'étape. p> 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) p> S'il vous plaît aidez-moi à extraire cette adresse IP à l'aide de n'importe quelle méthode. P> < / p>
4 Réponses :
Cette regex devrait fonctionner: \ s code> signifie aucun caractère de blanchissage, j'utilise avec le quantificateur + code> Obtenez toute l'URL avec l'adresse IP, puis pour capturer le groupe à l'intérieur des crochets, j'utilise ce groupe: p> ([\]]] +) code>. Il ne peut capturer que possible autant que possible les caractères code>] code>, afin de capturer toute l'adresse IP. p> p>
Ça a marché. Merci beaucoup. (Upvoted mais vous ne verrez pas de problèmes de réputation de Coz ici).
i Woudl Faites-le de la manière suivante: Notez que j'ai utilisé appelé r code> -string, afin que je puisse utiliser un seul \ code> comme évasion sans avoir besoin de l'échapper. Mon motif comprend 3 parties principales: p>
(? <= \ [) code> est une affirmation de longueur zéro, ce qui signifie: vérifier s'il y a [ code> avant la correspondance, [ code> doit être échappé comme il a une signification spéciale li>
\ d {1,3} \. \ d {1,3} \. \ d {1,3} \. \ d {1,3} code> est quatre chiffres constitués de 1 à 3 chiffres ( \ d code>) cisaillé par des points (. code> - une nouvelle évacuation est nécessaire, comme . code> a une signification particulière) li>
(? = \ \]) code> est une affirmation de longueur zéro, Signification: Vérifiez s'il y a ] code> après la correspondance, ] code> doit être échappé aussi. li>
ul> p>
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))
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 c'est simple - logstr.split ("Vérification de la cartographie inverse", 1) code> 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 p> p>
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.