1

I have a python code with full explaination of what it does in these questions Scrape text file with Python

Modify python code to include user input search feature

The code I have is compatible with 3.11 version of python and not with 3.8, I am looking to have the logic compatible with 3.8 so I can use that and execute on a server where latest version installed is 3.8

Code

import os

def scrape_ip(txt: str) -> str:
    blocks = txt.split('\n\n')
    res: list[dict] = []
    block: dict = {}
    for unparsed in blocks:
        tokens = [word for line in unparsed.splitlines() for word in line.split(' ') if word]
        match tokens:
            case ['Combination', comb, 'Tuple', tup, *_]:
                if block: 
                    res.append(block)
                block = {'Combination': int(comb[1:]), 'Tuple': int(tup[7:])}
            case ['Source', 'Groups:', *ips]:
                block['Source Groups'] = ips
            case ['Destination', 'IP:', *rest]:
                s = ' '.join(rest)
                s = s[s.index('Destination Group:') + 19:]
                block['Destination Groups'] = s.split(' ')
            case ['TCP', '|', port]:
                block['Port'] = int(port)
        
    if block:
        res.append(block)
    return res


def main():
    files = [file for file in os.listdir() if file.endswith('.txt')]
    res: dict[str: list[dict]] = {}
    for file in files:
        with open(file, 'r') as f:
            txt = f.read()
            f_res = scrape_ip(txt)
            res[file] = f_res
    
    for file, f_res in res.items():
        print(file)
        for block in f_res:
            for k, v in block.items():
                print(f'{k}: {v}')
            print()
        print()

    while search := input('Search For an IP (Enter nothing to exit) \n>>> '):
        search_res: list[str] = []
        for file, f_res in res.items():
            for block in f_res:
                if 'Source Groups' in block:
                    for ip in block['Source Groups']:
                        if search in ip:
                            search_res.append(f'{file} - Combination: {block["Combination"]}, Tuple: {block["Tuple"]} - Source Group: {ip}')
                if 'Destination Groups' in block:
                    for ip in block['Destination Groups']:
                        if search in ip:
                            search_res.append(f'{file} - Combination: {block["Combination"]}, Tuple: {block["Tuple"]} - Destination Group: {block["Destination Groups"]}')
        if search_res:
            print('Search Results:')
            for result in search_res:
                print(result)
        else:
            print('No Results Found')


if __name__ == '__main__':
    main()

Please if anyone can help, that would be great.

jsbueno
  • 99,910
  • 10
  • 151
  • 209
Noah
  • 35
  • 4
  • 1
    It seems that only the `match`/`case` part needs to be converted. – InSync Apr 09 '23 at 02:35
  • 4
    Read the documentation of `match/case` and figure out how to implement the same logic yourself. In this case, it's just a few `if` statement, e.g. `if len(tokens) >= 4 and tokens[0] == 'Combination' and tokens[2] == 'Tuple':` – Barmar Apr 09 '23 at 02:39

0 Answers0