Регулярное выражение Python для отлова имен портов Verilog - PullRequest
0 голосов
/ 01 октября 2019

У меня есть несколько операторов вывода порта в текстовом файле verilog, как показано ниже, и я хочу записать только имена портов.

Пример примера:

output Y;
output Y1,Y2,Y3;
output Z;
output Q, QN;

Ожидаемый вывод, который я хочу, - это списокс именами выходных портов

(Y)
(Y1, Y2, Y3)
(Z)
(Q,QN)

Я попробовал приведенный ниже код, но он не дает мне список, который мне нужен.

outputPortListPattern=re.compile(r'^\s*(output)\s+(.*);',flags=re.M)
with open(fileA) as fh_in:
    with open(fileB, "w") as fh_out:
        for line in fh_in:
            match=outputPortListPattern.match(line)
            if match:
                matchlist = match.group(2)
                print("Output port list={}".format(matchlist))

Ответы [ 2 ]

2 голосов
/ 01 октября 2019

Учитывая, что у вас есть формат output PORT1, PORT2, ..., PORTN;. Вы можете использовать следующий код, который не нуждается в регулярном выражении:

for line in fh_in:
    ports = line.replace('output ', '')[:-1]
    print(f'({ports})')

Очевидно, вам нужно будет открыть файлы, используя with.

Если ваш входной файл:

output Y;
output Y1,Y2,Y3;
output Z;
output Q, QN;

Ваш вывод будет:

(Y)
(Y1,Y2,Y3)
(Z)
(Q, QN)
1 голос
/ 01 октября 2019

Если вы хотите указать list имен портов, то:

import re

text = """output Y;
output Y1,Y2,Y3;
output Z;
output Q, QN;"""

[re.split(r',\s*', m.group(1))
    for m in re.finditer(r'^output\s+(([^,;]+)(\s*,([^,;]+))*);$', text, flags=re.M)
]

Печать:

[['Y'], ['Y1', 'Y2', 'Y3'], ['Z'], ['Q', 'QN']]
...