上下文
我正在解析一些代码,并希望在函数之前匹配doxygen注释。但是,因为我想匹配特定的函数名称,所以只获取前一个注释会给我带来问题。
当前方法
import re
function_re = re.compile(
r"\/\*\*(.+)\*\/\s*void\s+(\w+)\s*::\s*function_name\s*\(\s*\)\s*")
function_match = function_re.search(file_string)
if function_match:
function_doc_str = update_match.group(2)
当前方法的问题
目前的方法匹配早期函数的doxygen,给我一个错误的doxygen评论的结果。
问题
有没有办法使用Python Regex库向后搜索字符串?
似乎我的问题是更具限制性(不太频繁发生的部分)是函数签名,“void function()”
可能更好的问题
是否有更好(更容易)的方法,我缺少?
答案 0 :(得分:2)
(commentRegex)functionRegex
然后只提取组1.您需要以多行模式运行才能使其正常工作,我不知道python,所以我无法提供更多帮助。
前瞻断言也是可能的,但这种方式更简单。
答案 1 :(得分:2)
我认为你应该使用只匹配函数之前的doxymentation的正则表达式。也许是这样的(简化示例):
import re
test = """
/**
@doxygen comment
*/
void function()
{
}
"""
doxygenRegex = r"(?P<comment>/\*\*(?:[^/]|/(?!\*\*))*\*/)"
functionRegex = r"(?P<function>\s\w+\s+(?P<functionName>\w+)\s*\()"
match = re.search(doxygenRegex + functionRegex, test)
print match.groupdict()
只要匹配某些内容,您就可以循环使用正则表达式匹配 - 但下次在test[match.end():]
开始搜索。希望对你有意义......
顺便说一句,如果您只想提取评论而不想提及该功能,可以使用前瞻 - 只需将functionRegex
替换为r"(?=\s\w+\s+\w+\s*\()"
。
答案 2 :(得分:2)
这可以使用单一的注册表来实现。
关键是在所需功能之前捕获注释。
这样做的简单方法是使用非贪婪的限定符。
例如:带有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 = "(/\*\*(?:[^\*]|\*(?!/))*\*/)"
。
希望这有帮助。
答案 3 :(得分:1)
请注意,C不是常规语言,因此无法通过正则表达式进行解析。您是否考虑过利用doxygen本身来解析此文件?
答案 4 :(得分:0)
您可以使用(?<=...)
或(?<!...)
进行后视断言,但一般情况下您只能匹配前进。
答案 5 :(得分:0)
问题是为什么这些评论不在函数内部,因此您可以使用 doc 。
但正则表达式没有简单的方法。
答案 6 :(得分:0)
这是一个非正则表达式方法,在*/
上拆分并查找您要查找的函数是否在下一个项目中。例如
test = """
/**
@doxygen comment
*/
void function()
{
}
"""
t=test.split("*/")
for n,comm in enumerate(t):
try:
if "void" in t[n+1]:
print t[n]
except IndexError: pass