Мой код регулярного выражения Python не дает мне вывод, как я ожидал

Я пытался извлечь и разобрать слова (имя хоста и версия) из текстового файла. когда я запускаю свой код, он записывает данные в CSV-файл, но вывод выглядит иначе. вывод у меня был после разбора в CSV

 **my input file is .txt and below is the content** 
 Hostname Router1
 version 15.01
 code:
 line console 0
 logging synchronous
 exec-timeout 15 1
 usb-inactivity-timeout 15
 exec prompt timestamp
 transport preferred none

Hostname Router2
version 15.02
line vty 0 15
logging synchronous
exec-timeout 15 2
exec prompt timestamp
transport input ssh
transport preferred none
access-class REMOTE_ACCESS in

Hostname Router3
version 15
line console 0
logging synchronous
exec-timeout 15 3
usb-inactivity-timeout 15
exec prompt timestamp
transport preferred none

Hostname Router3
version 15.12
line vty 0 15
logging synchronous
exec-timeout 15 4
exec prompt timestamp
transport input ssh
transport preferred none
access-class REMOTE_ACCESS in
**Above is the sample content in my input text file**
$
import re
import csv
with open('sample5.csv','w',newline='') as output:
    HeaderFields = ['Hostname','version']
    writer = csv.DictWriter(output,fieldnames=HeaderFields)
    writer.writeheader()
with open('testfile.txt','r',encoding='utf-8') as input:
    for line in input.readlines():
       pattern = re.compile(r'Hostname(.*)''|''version(.*)')
       match=pattern.finditer(line)
       for match1 in match:
          with open('sample5.csv', 'a',newline='') as output:
              writer = csv.DictWriter(output, fieldnames=HeaderFields)
              writer.writerow({'Hostname': match1.group(1), 'version':  
                                match1.group(2)})

Мой ожидаемый результат в CSV выглядит следующим образом: Это должно быть результатом в CSV

Благодарю вас.

1 ответ

Ваш код не выполняется, потому что в каждой итерации вы читаете только одну строку (которая может содержать хост или версию, но не обе, но вы записываете данные в csv. Давайте переберем весь текст, сопоставляя двойники: с именем хоста первой строки и версией второй строки.... \ n работает как разрыв строки для Windows (я слышал, что Mac использует \ r не уверен). Теперь, когда вы сопоставляете двойники, вы можете получить как маршрутизатор, так и версию из одного и того же объекта сопоставления.

with open('testfile.txt','r',encoding='utf-8') as input:
       txt = input.read()
       pattern = re.compile(r'Hostname (.*)(\r\n?|\n)version (.*)')
       match=pattern.finditer(txt)
       for match1 in match:
          with open('sample5.csv', 'a',newline='') as output:
             writer = csv.DictWriter(output, fieldnames=HeaderFields)
             writer.writerow({'Hostname': match1.group(1), 'version':  
                            match1.group(3)})
Другие вопросы по тегам