-1
votes

Comment écrivez-vous uniquement la regex correspondante à un nouveau fichier de Python?

Mon objectif est d'extraire les adresses IP uniquement et d'annoncer à un nouveau fichier. Le fichier que j'ai s'appelle error_log.txt et contient des lignes telles que:

[Sun Jun 7 16:45:56 2020] [Info] [Client 64.242.88.10] (104) Réinitialisation de la connexion par Peer: Client arrêté la connexion avant d'envoyer le corps terminé p> blockQuote>

[Sun Jun 7 17:13:50 2020] [Info] [Client 64.242.88.10] (104) Connexion Réinitialiser par Peer: Client arrêté la connexion avant d'envoyer le corps terminé P> blockquote>

L'objectif est d'écrire "64.242.88.10" et le reste de l'IPS à un nouveau fichier à un nouveau fichier. p>

Je peux obtenir la fonction d'impression pour me donner uniquement les IPS, mais quand Il écrit au fichier 'ip_only.txt' IT imprime la ligne complète à partir du journal d'erreur. P>

Comment puis-je simplement obtenir les IP uniquement au nouveau fichier (dans une colonne)? P> Bonus, quand il imprime lorsque vous testez, cela me donne aussi les lignes vides. Comment puis-je omettre ces lignes? P>

import re

with open('error_log.txt', 'r') as file:
    fi = file.readlines()

ip_only = open('ip_only.txt', 'w+')

re_ip = re.compile("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")

for line in fi:
    ip = re.findall(re_ip, line)
    ip_only.write(str(line))
    # print(ip)


2 commentaires

Pourquoi êtes-vous écrire (ligne) si vous avez besoin écrire (IP) ?


Pour ignorer les chaînes vides si ip.strip ()! = "": ou plus court sinon ip.strip ():


3 Réponses :


1
votes

Vous devez écrire la variable code> ip code> au fichier au lieu de Ligne code> qui contient la ligne d'origine:

for line in fi:
    ips = re.findall(re_ip, line)
    for ip in ips:
        ip_only.write(ip + '\n')

# ip_only.txt:
# 64.242.88.10
# 64.242.88.10


2 commentaires

Ce changement de code crée un fichier vierge, mais n'écrire aucune ligne maintenant.


C'est étrange, je l'ai testé dans mon environnement local avec les lignes de journal d'erreur que vous avez fournies et cela fonctionne pour moi.



0
votes
  1. en écrivant dans un fichier, vous écrivez toute la ligne. Écrivez plutôt que les IPS comme ci-dessous IP_ONLY.WRITE (STR (IP))

  2. Pour éviter les lignes vides, vous pouvez avoir une condition IF pour vérifier, que l'IP soit trouvée ou non dans la ligne donnée. xxx


0 commentaires

0
votes

si impression (IP) vous donne un résultat attendu, vous devez utiliser écrire (IP) au lieu de écrire (ligne)

Regex donne une liste afin que vous puissiez peut-être écrire uniquement IP [0] . Et vous devez ajouter \ n pour passer à la ligne suivante. xxx

comme pour la ligne vide - d'abord supprimer tous les espaces, onglets, entre et Commencez ensuite avec String vide "" . Ou utilisez le fait que la chaîne vide donne false lorsqu'il est utilisé dans si / else xxx


xxx

0 commentaires