Я хочу проанализировать файл с этим вложенным форматом:
/begin FUNCTION
foo
"1.2.12 foo_long"
/begin DEF1
/end DEF1
FUNCTION_VERSION "1.2.0"
/end FUNCTION
/begin FUNCTION
bar
""
/end FUNCTION
/begin FUNCTION
urbi
"10.15.23 urbi_long"
/begin DEF1
/end DEF1
FUNCTION_VERSION "10.15.3"
/end FUNCTION
Из этого я хочу извлечь имена функций, длинные имена и номер версии.
Я делаю это сследующее регулярное выражение:
sSearch = r'/begin FUNCTION\s+(\w*)\s+"[\d\._\s]*([^"]+)*"(.*?)FUNCTION_VERSION\s+"([^"]+)"\s+/end FUNCTION'
lMatches = re.findall(sSearch, sFileContent, re.S)
dMatches = {args[0]: [args[3], args[1]] for args in lMatches if args}
print(dMatches)
Это приводит к:
{'foo': ['1.2.0', 'foo_long'], 'bar': ['10.15.3', '']}
Версия функции из urbi
ошибочно присвоена bar
.Я не хочу, чтобы bar
возвращался вообще, поскольку он не содержит версию функции.
Как я могу адаптировать регулярное выражение, которое выпускает вхождение /begin FUNCTION
до bar
, когда end FUNCTION
найден без ведущего function version
?
Я бы хотел, чтобы вывод был:
{'foo': ['1.2.0', 'foo_long'], 'urbi': ['10.15.3', 'urbi_long']}
PS Что меня также смущает, так это то, почему мне нужно добавить ненужную группу захвата (.*?)
в середине.Разве это не должно работать и с простым .*
?