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

希望這會有所幫助。

相關問題