Это может быть достигнуто с помощью одного регулярного примера.
Ключ заключается в захвате комментария непосредственно перед желаемой функцией.
Самый простой способ сделать это - использовать не жадный квалификатор.
Например: /\*\*(.*?)\*/
с флагом MULTILINE;
однако в Python не-жадные и MULTILINE не работают вместе (по крайней мере, в моей среде).
Итак, вам нужен маленький трюк, подобный этому:
/\*\*((?:[^\*]|\*(?!/))*)\*/
.
Это соответствует:
1: комментарий начинается /**
.
2: все, что не *
ИЛИ *
, что не следует /
3: конец комментария */
.
Исходя из этой идеи, вам нужен код:
function_name = "function2"
regex_comment = "/\*\*((?:[^\*]|\*(?!/))*)\*/"
regex_static = "(?:(\w+)\s*::\s*)?"
regex_function = "(\w+)\s+"+regex_static+"(?:"+function_name+")\s*\([^\)]*\)"
regex = re.compile(regex_comment+"\s*"+regex_function, re.MULTILINE)
text = """
/**
@doxygen comment1
*/
void test::function1()
{
}
/**
@doxygen comment2
*/
void test::function2()
{
}
"""
match = regex.search(text)
if (match == None): print "None"
else: print match.group(1)
При запуске вы получаете:
@doxygen comment2
Изменение:
Если вы хотите захватить /**
и */
, используйте regex_comment = "(/\*\*(?:[^\*]|\*(?!/))*\*/)"
.
Надеюсь, это поможет.