使用正则表达式在Python中向后搜索字符串?

时间:2010-03-19 21:52:23

标签: python regex

上下文
我正在解析一些代码,并希望在函数之前匹配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()”

可能更好的问题
是否有更好(更容易)的方法,我缺少?

7 个答案:

答案 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