2010-03-19 60 views
1

语境
我解析了一些代码,并希望有一个函数之前匹配doxygen的意见。然而,因为我想匹配一个特定的函数名称,只有刚才的评论给我的问题。使用正则表达式(在Python中)通过字符串向后搜索?

当前的方法

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正则表达式库中的串向后搜索?
好像我的问题是更严格(较不频繁出现的部分)是函数签名,“void函数()”

可能更好的问题
有没有更好的(容易)的方法,我错过了?

+0

我对帮助你很感兴趣,但我对Doxygen并不熟悉。你可以发布一些代码吗?顺便说一下,您还可以查看“lookbehide”和“lookahead”。我相信它会帮助你。 – NawaMan 2010-03-19 21:57:42

+0

嗯,当你可以反转你的输入和模式字符串(或使它们通过索引重新计算的包装显示反转)并以通常的方式搜索/正则表达式时(我没有使用正则表达式的经验,是的) ? – mlvljr 2010-03-20 08:28:16

回答

0

您可以使用(?<=...)(?<!...)做隐藏断言,但通常情况下,您只能匹配转发。

+0

在.NET中,您可以对该功能进行前瞻性查看,然后进行评论。不幸的是,在Python中,lookbehinds只能匹配固定长度的字符串。 – 2010-03-19 23:36:37

0

问题是为什么这些注释不在函数内部,所以你可以使用doc

但与正则表达式没有简单的方法。

+0

他可能正在创建一个python应用程序来阅读C语言中的doxygen注释或其他内容 – 2010-03-20 06:11:58

2

最简单的方法是只使用一组,你并不需要往回走......

(commentRegex)functionRegex 

然后,只需抽取组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():]下一次搜索。希望对你有意义...

顺便说一句,如果你只想提取注释而没有关于该函数,可以使用lookahead - 只需将functionRegex替换为r"(?=\s\w+\s+\w+\s*\()"即可。

+0

...诀窍在于确保“注释”正则表达式不能一次匹配多个注释。 (你忘了提到'狗')顺便说一句,“函数”正则表达式不应该以'\ s +'或'\ s *'开头吗? – 2010-03-19 23:53:32

+0

是的,它只会匹配函数前的最后一个注释。它可能是'\ s +',对。如上所述,这是一个简单的例子。 – AndiDog 2010-03-20 10:04:37

1

注意,C是不是一个正规的语言,所以它不能使用正则表达式解析。你有没有考虑过利用doxygen来解析这个文件?

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 
2

这可以使用单个reg-ex来实现。

关键是在所需功能之前捕获注释。 这样做的简单方法是使用非贪婪修饰符。 例如:带有MULTILINE标志的/\*\*(.*?)\*/;然而,在Python中,非贪婪和MULTILINE不能一起工作(至少在我的环境中)。 所以,你需要这样一个小技巧:

/\*\*((?:[^\*]|\*(?!/))*)\*/

这是匹配:

1:注释开始/**

2:注释结束*/:一切不是* OR *不通过/

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 = "(/\*\*(?:[^\*]|\*(?!/))*\*/)"

希望这会有所帮助。

相关问题