Мой код регулярного выражения Python не дает мне вывод, как я ожидал
Я пытался извлечь и разобрать слова (имя хоста и версия) из текстового файла. когда я запускаю свой код, он записывает данные в 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 выглядит следующим образом:
Благодарю вас.
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)})