簡體   English   中英

如何僅將匹配的正則表達式寫入 Python 中的新文件?

[英]How do I write only the matching regex to a new file in Python?

我的目標是僅將 IP 地址和 append 地址提取到新文件中。 我擁有的文件名為 error_log.txt ,其中包含以下行:

[Sun Jun 7 16:45:56 2020] [info] [client 64.242.88.10] (104)Connection reset by peer:客戶端在發送正文完成之前停止連接

[Sun Jun 7 17:13:50 2020] [info] [client 64.242.88.10] (104)Connection reset by peer:客戶端在發送正文完成前停止連接

目標是將 IP 的“64.242.88.10”和 rest 寫入新文件。

我可以打印 function 來只給我 IP,但是當它寫入文件 'ip_only.txt' 時,它會打印錯誤日志中的完整行。

我怎樣才能只獲取新文件的 IP(在一列中)?

獎勵,當它在測試時打印時,它也給了我空白行。 我怎樣才能省略這些行?

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)

您需要將ip變量寫入文件而不是包含原始line的行:

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

# ip_only.txt:
# ['64.242.88.10']['64.242.88.10']

此外,要從 output 中刪除括號和引號(注意re.findall()返回字符串列表)並將每個 IP 地址打印到新行:

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
  1. 在寫入文件時,您正在寫入整行。 而是只寫下面的IP ip_only.write(str(ip))

  2. 為避免出現空行,您可以使用 if 條件來檢查 ip 是否在給定行中找到。

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

如果print(ip)給你預期的結果,那么你應該使用write(ip)而不是write(line)

正則表達式給出列表,因此您可能只需要編寫ip[0] 您需要添加\n才能移動到下一行。

        ip_only.write(ip[0] + "\n")

至於空行 - 首先刪除所有空格、制表符、回車,然后與空字符串""進行比較。 或者使用空字符串在if/else中使用時給出False的事實

    line = line.strip()
    if line:
         # ... code ...

import re

fi = [
    '[Sun Jun 7 16:45:56 2020] [info] [client 64.242.88.10] (104)Connection reset by peer: client stopped connection before send body completed',
    '[Sun Jun 7 17:13:50 2020] [info] [client 64.242.88.10] (104)Connection reset by peer: client stopped connection before send body completed',
]    


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:
    line = line.strip()
    if line:
        ip = re.findall(re_ip, line)
        ip_only.write(ip[0] + "\n")
        print(ip[0])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM