мне нужно искать что-то вроде этого:питона обратной ссылки регулярного выражению
lines = """package p_dio_bfm is
procedure setBFMCmd (
variable pin : in tBFMCmd
);
end p_dio_bfm; -- end package;
package body p_dio_bfm is
procedure setBFMCmd (
variable pin : in tBFMCmd
) is
begin
bfm_cmd := pin;
end setBFMCmd;
end p_dio_bfm;"""
Мне нужно извлечь имя пакета, т.е. p_dio_bfm и объявление пакета, то есть часть между «пакетом p_dio_bfm является» и FIRST «конец p_dio_bfm ;»
Проблема в том, что объявление пакета может заканчиваться на «end p_dio_bfm;» или "конечный пакет"; Поэтому я попробовал следующее «OR» регулярное выражение, которое: - работает для пакетов, заканчивающихся «end package» - не работает для пакетов, заканчивающихся «end pck_name;»;
pattern = re.compile("package\s+(\w+)\s+is(.*)end\s+(package|\1)\s*;")
match = pattern.search(lines)
Проблема заключается в том (пакете | \ 1) часть регулярного выражения, где я, что поймать или слово «пакет» или совпадающее имя пакета.
UPDATE: Я представил полный код, который я надеюсь, прояснит его:
import re
lines1 = """package p_dio_bfm is
procedure setBFMCmd (
variable pin : in tBFMCmd
);
end p_dio_bfm;
package body p_dio_bfm is
procedure setBFMCmd (
variable pin : in tBFMCmd
) is
begin
bfm_cmd := pin;
end setBFMCmd;
end p_dio_bfm;"""
lines2 = """package p_dio_bfm is
procedure setBFMCmd (
variable pin : in tBFMCmd
);
end package;
package body p_dio_bfm is
procedure setBFMCmd (
variable pin : in tBFMCmd
) is
begin
bfm_cmd := pin;
end setBFMCmd;
end package;"""
lines1 = lines1.replace('\n', ' ')
print lines1
pattern = re.compile("package\s+(\w+)\s+is(.*)end\s+(package|\1)\s*;")
match = pattern.search(lines1)
print match
lines2 = lines2.replace('\n', ' ')
print lines2
match = pattern.search(lines2)
print match
Я ожидаю, что в обоих случаях, используя уникальный регулярное выражение, чтобы получить обратно эту часть:
"""procedure setBFMCmd (
variable pin : in tBFMCmd
);"""
без \ n символов, которые я удалил.
Можете ли вы опубликовать ожидаемый результат? –