繁体   English   中英

不使用正则表达式从文本文件中提取 IP 地址

[英]Extract IP addresses from text file without using REGEX

我正在尝试从文本文件中提取 IPv4 地址并将它们作为列表保存到新文件中,但是,我不能使用正则表达式来解析文件,而是单独检查字符。 不太确定从哪里开始,我发现的所有内容似乎都将 import re 作为第一行。

到目前为止,这就是我所拥有的,

#Opens and prints wireShark txt file
fileObject = open("wireShark.txt", "r")
data = fileObject.read()
print(data)

#Save IP adresses to new file
with open('wireShark.txt') as fin, open('IPAdressess.txt', 'wt') as fout:
    list(fout.write(line) for line in fin if line.rstrip())


#Opens and prints IPAdressess txt file    
fileObject = open("IPAdressess.txt", "r")
data = fileObject.read()
print(data)

#Close Files
fin.close()
fout.close()

所以我打开文件,并创建了将提取的 IP 放入的文件,我只是不知道如何在不使用 REGEX 的情况下提取它们。

谢谢您的帮助。

这是一个可能的解决方案。

function find_first_digit , position 文本中下一个数字的索引(如果有)并返回True 否则返回False

函数get_dotget_num读取一个数字/点,并让 position 的索引紧跟在数字/点之后,并将数字/点作为str返回。 如果其中一个函数未能获得数字/点,则会引发MissMatch异常。

在主循环中,找到一个数字,保存索引,然后尝试得到一个 ip。

如果成功,将其写入 output 文件。

如果任何被调用的函数引发MissMatch异常,请将当前索引设置为保存的索引加一并重新开始。

class MissMatch(Exception):pass

INPUT_FILE_NAME = 'text'
OUTPUT_FILE_NAME = 'ip_list'
                

def find_first_digit():
    
    while True:
        c = input_file.read(1)
        if not c: # EOF found!
            return False
        elif c.isdigit():
            input_file.seek(input_file.tell() - 1)
            return True


def get_num():

    num = input_file.read(1)  # 1st digit
    if not num.isdigit():
        raise MissMatch
    if num != '0':
        for i in range(2):    # 2nd 3th digits
            c = input_file.read(1)
            if c.isdigit():
                num += c
            else:
                input_file.seek(input_file.tell() - 1)
                break
    return num


def get_dot():
    
    if input_file.read(1) == '.':
        return '.'
    else:
        raise MissMatch


with open(INPUT_FILE_NAME) as input_file, open(OUTPUT_FILE_NAME, 'w') as output_file:
    while True:
        ip = ''
        if not find_first_digit():
            break
        saved_position = input_file.tell()
        
        try:
            ip = get_num() + get_dot() \
               + get_num() + get_dot() \
               + get_num() + get_dot() \
               + get_num()
        except MissMatch:
            input_file.seek(saved_position + 1)
        else:
            output_file.write(ip + '\n')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM