Поскольку я, похоже, помню, что использование python для анализа выходных файлов nmap было одним из моих первых приложений на python, я могу сделать пару рекомендаций:
1) Если вы хотите изучить синтаксический анализ XML и python, рекомендуется использовать альтернативный формат XML nmap. Преимущество этого заключается в том, что вывод XML менее похож на изменение небольшими, но разрушающими сценарии способами, в отличие от вывода простого текста. (По сути, сопоставление со строковыми полями отлично подходит для быстрого взлома, но почти гарантированно укусит вас в будущем, как я узнал, когда был обновлен nmap, и они немного изменили формат одного из столбцов, над которыми я разбирал ... также думаю, что я получил немного, когда мы обновили один из окон Windows, и некоторые тексты в полях ОС или служб совпали с чем-то, с чем я соответствовал. Если вы хотите пойти по этому пути, я могу посмотреть, есть ли у меня nmap парсер использует xpath, лежащий вокруг
2) Если вы хотите использовать вывод текста и регулярные выражения, я бы посоветовал узнать о группировке.
В частности, вместо создания пользовательских шаблонов для каждого порта вы можете определить группу и проверить это вместо этого.
import re
r = re.compile("(/d+)/open") # match one or more digits followed by /open
mm = r.match(line) #mm will either be None or a match result object, if mm is not None, you can do mm.groups()[0] to get the port #.