在Python中读取IP地址

2024-04-25 04:44:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一个Python脚本(由一位同事编写),它获取输出文件并获取ping命令的IP地址和结果,以确定可达性状态。问题:脚本正在抓取子网掩码,而不是主机IP。我不明白为什么正则表达式与IP地址不匹配。下面是脚本生成的代码和输出文件的示例:

enter code here


import glob
import re
from tkinter.filedialog import askdirectory
from tkinter import Tk
import os
import ntpath

new_file = []
results_file = []
success_file = []
failure_file = []
new_count = 0
regex_clean = re.compile('ip address')
regex_source = re.compile('ip address')
regex_destination = re.compile('chos to')
regex_success = re.compile('!')
regex_failure = re.compile('\.\.\.\.\.|U\.U\.U')
regex_ip_address = re.compile('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')
regex_final_success = re.compile('SUCCESS')
regex_final_failure = re.compile('FAILURE')


def find_files(files_directory):
    file_list = []
    os.chdir(files_directory)
    for file in glob.glob("*.txt"):
        # print(files_directory + '/' + file)
        file_list.append(files_directory + '/' + file)
    return file_list


def clean_data(file):
    with open(file, 'r') as f:
        h = f.readlines()
        for num, line in enumerate(h):
            if regex_clean.search(line) is not None:
                for line2 in h[num-1:num+12]:
                    new_file.append(line2)
                    # print(new_file)
    return new_file


def find_results(new_file):
    for num, line in enumerate(new_file):
        if regex_success.search(line) is not None:
            test_status = 'SUCCESS!'
            if test_status:
                results_file.append('Test Status: ' + test_status)
            # print(results_file)
        if regex_failure.search(line) is not None:
            test_status = 'FAILURE!'
            if test_status:
                results_file.append('Test Status: ' + test_status)
            # print(results_file)
        if regex_source.search(line) is not None:
            source_address = regex_ip_address.findall(line)
            if source_address:
                for ip in source_address:
                    results_file.append('Configured Address: ' + ip)
            # print(results_file)
        if regex_destination.search(line) is not None:
            destination_address = regex_ip_address.findall(line)
            if destination_address:
                for ip in destination_address:
                    results_file.append('Destination Address: ' + ip)
            # print(results_file)
    return results_file


def create_final_files(results_file):
    for num, line in enumerate(results_file):
        # print(line)
        # print("1")
        if regex_final_success.search(line) is not None:
            for line2 in results_file[num-2:num+1]:
                success_file.append(line2)
                # print('SUCCESS FILE')
                # print("2")
                # print(success_file)
                # print('SUCCESS FILE')
        elif regex_final_failure.search(line) is not None:
            for line3 in results_file[num-2:num+1]:
                failure_file.append(line3)
                # print('FAILURE FILE')
                # print("3")
                # print(failure_file)
                # print('FAILURE FILE')
    return success_file, failure_file


def clean_filename(file):
    head, tail = ntpath.split(file)
    return tail


def create_output_files(success_file, failure_file, save_directory, filename):
    success_filename = save_directory + "/SUCCESS_FILE.txt"
    failure_filename = save_directory + "/FAILURE_FILE.txt"

    with open(success_filename, 'a') as f:
        f.write("\n\n")
        f.write("SOURCE FILE: %s\n" % filename)
        f.write("\n")
        for item in success_file:
            f.write("%s\n" % item)

    with open(failure_filename, 'a') as f:
        f.write("\n\n")
        f.write("SOURCE FILE: %s\n" % filename)
        f.write("\n")
        for item in failure_file:
            f.write("%s\n" % item)


if __name__ == '__main__':
    root = Tk()
    print('Welcome to the quick REGEX script!')
    print('This will take ping outputs and return the device IP addresses, and successes, failures in two files.\n')
    print('Select directory containing ping files:')
    files_directory = askdirectory()
    print('FILE DIRECTORY: ' + files_directory)
    print('\n')
    print('Select directory to use for created files:')
    save_directory = askdirectory()
    print('SAVE DIRECTORY: ' + save_directory)
    file_list = find_files(files_directory)
    file_count = len(file_list)
    print('TOTAL FILES: ' + str(file_count))
    # print(file_list)
    for n, file in enumerate(file_list):
        new_count = new_count + 1
        percent_complete = (new_count / file_count) * 100
        print('PERCENT COMPLETE: ' + str(percent_complete) + '%')
        new_file = []
        results_file = []
        success_file = []
        failure_file = []
        # print(type(file))
        # print(file)
        new_file = clean_data(file)
        results_file = find_results(new_file)
        results_file = find_results(new_file)
        # print('RESULTS FILE')
        # print (results_file)
        # print('END OF RESULTS FILE')
        success_file, failure_file = create_final_files(results_file)
        # print('SUCCESS FILE')
        # print(success_file)
        # print('END OF SUCCESS FILE')
        # print('FAILURE FILE')
        # print(failure_file)
        # print('END OF FAILURE FILE')
        filename = clean_filename(file)
        # print('FILE NAME: ' + filename)
        create_output_files(success_file, failure_file, save_directory, filename)
    print('COMPLETE!')
    sleep(5)

    root.destroy()

源文件示例:

^{pr2}$

输出脚本示例:

Configured Address: 255.255.255.192
Destination Address: AAA.BBB.67.97
Test Status: SUCCESS!
Configured Address: 255.255.255.192
Destination Address: AAA.BBB.67.97
Test Status: SUCCESS!
Test Status: SUCCESS!
Destination Address: AAA.BBB.75.97
Test Status: SUCCESS!
Configured Address: 255.255.255.192
Destination Address: AAA.BBB.67.97
Test Status: SUCCESS!
Configured Address: 255.255.255.192
Destination Address: AAA.BBB.67.97
Test Status: SUCCESS!
Test Status: SUCCESS!
Destination Address: AAA.BBB.75.97
Test Status: SUCCESS!

Tags: innewforfailureaddresslinefilesresults
1条回答
网友
1楼 · 发布于 2024-04-25 04:44:24

The script is scraping the subnet mask and not the host IP. I don't understand why the regex doesn't match the IP address.

正则表达式正在查找3个用点分隔的十进制数(由1到3个数字组成)。所以它找到子网掩码“255.255.255.192”,而找不到AAA.BBB公司.67.97英寸。在

顺便说一句,像绳子一样”AAA.BBB公司.67.97“不是IP地址。在

相关问题 更多 >