2010-03-19 5 views
1

컨텍스트
일부 코드를 구문 분석 중이며 함수 앞에 doxygen 주석을 일치 시키려고합니다. 그러나 특정 함수 이름과 일치시키기 위해 바로 이전 주석 만 가져 오면 문제가 발생합니다. 현재 접근
현재의 접근 방식은 나에게 잘못 doxygen이 주석 인 결과를 제공, 이전 기능에서 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) 

문제.

질문
파이썬 정규식 라이브러리를 사용하여 문자열을 통해 이전 버전을 검색 할 수있는 방법이 있나요? 내 문제가 더 제한적인 (자주 발생하는 부분)이다 함수 서명처럼
그것은 보인다 "무효() 함수를"가능한 더 나은 질문

더 나은 (쉽게) 접근 방식이 있다는 것을 I 실종 됐어?

+0

저는 당신을 돕는데 매우 관심이 있지만 저는 Doxygen에 익숙하지 않습니다. 코드를 게시 할 수 있습니까? 그런데 "lookbehide"와 "lookahead"도 살펴볼 수 있습니다. 나는 그것이 당신을 도울 것이라고 확신합니다. – NawaMan

+0

음, 입력 문자열과 패턴 문자열을 반대로 (또는 색인 재 계산 래퍼를 통해 반대로 표시되도록) 일반적인 방법으로 검색/정규 표현할 수있는 경우는 아닙니다. 정규 표현식에 대한 경험이 없습니다. ? – mlvljr

답변

0

(?<=...) 또는 (?<!...)과 함께 룩어 드 어설 션을 수행 할 수 있지만 일반적으로 포워드 만 일치시킬 수 있습니다.

+0

.NET에서 함수에 대한 미리보기를 수행하고 주석에 대한 lookbehind를 수행 할 수 있습니다. 불행하게도 파이썬 lookbehinds는 고정 길이 문자열에만 일치 할 수 있습니다. –

0

질문은이 주석이 함수 내에없는 이유입니다. 따라서 을 사용할 수 있습니다.

그러나 정규식을 사용하는 쉬운 방법은 없습니다.

+0

그는 C 또는 무엇인가 –

2

간단한 방법은, 당신이 ... 뒤로 갈 필요가 없습니다 그냥 그룹을 사용하는 것입니다

(commentRegex)functionRegex 

그럼 그냥 당신은 그것을 얻기 위해 멀티 라인 모드에서 실행해야합니다 그룹 1. 추출 일하고, 나는 파이썬을 모른다. 그래서 나는 더 도움이 될 수 없다.

lookahead 어설 션으로도 가능하지만이 방법은 더 간단합니다.

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():] 다음에서 검색을 시작. 희망은 당신에게 의미가 있습니다 ...

BTW 기능에 대한 설명 만 추출하고 싶다면 lookahead를 사용할 수 있습니다. functionRegexr"(?=\s\w+\s+\w+\s*\()"으로 바꿉니다.

+0

에서 doxygen 주석을 읽는 비단뱀 응용 프로그램을 만들 수 있습니다 ... "주석"정규식이 한 번에 두 개 이상의 주석과 일치 할 수 없도록하는 트릭입니다. (당신은 'Dog.)을 언급하는 것을 잊었습니다. BTW, "function"정규식이'\ s +'또는'\ s *'로 시작해서는 안됩니까? –

+0

예, 함수 앞에있는 마지막 주석과 만 일치합니다. 그리고 그것은'\ s +'일 수도 있습니다. 말했듯이, 단순화 된 예입니다. – AndiDog

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에서는 비 탐욕심과 다중성이 함께 작동하지 않습니다 (적어도 내 환경에서는). 이렇게 작은 트릭이 필요합니다.

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

이 일치하는 것입니다

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 = "(/\*\*(?:[^\*]|\*(?!/))*\*/)"를 사용합니다.

희망이 도움이됩니다.

관련 문제