2014-02-27 1 views
0

[abc]과 일치하는 것을 찾으려고하는데, 파이썬 정규식을 사용하는 [[abc]]이 아닙니다.파이썬에서 부정 lookbehind 어설 션

나는 부정적인 표정 어설 션 (?<!)을 사용하여 다음과 같이 [[abc]]을 필터링합니다. 제 브라켓 다음 하나가 아닌 [ 확인 않는

link = r"((?<!\[)\[([^<].+?) \s*([|] \s* (.+?) \s*)?])" 
compLink = re.compile(link, re.X | re.U) 

그러나 [[... 만족하는 조건에서 제 브래킷으로 작동하지 않는다.

>>> a = compLink.findall("[[abc|Hi]]") 
>>> a 
[('[[abc|Hi]', '[abc', '|Hi', 'Hi')] 

어떻게이 문제를 해결하기 위해?

+0

무엇에 대해 [[[abc]'? –

+0

@Sabuj : 일치합니다. – prosseek

답변

1

이 작업을 시도 할 수 있습니다 :

(?<!\[)\[([^][]+)]|\[([^][]+)](?!]) 

내용은 그룹 1 또는 2

주에 : 옵션이 여기에 필요하지 않은 재. 대괄호의 가장 깊은 수준을 추출하기 만하면

, 이러한 패턴은 충분 :

\[([^][]+)]   # for the whole substring (with a capturing group) 

또는

(?<=\[)[^][]+(?=]) # for the content only (i.e. the whole match) 

참고 문자 클래스에서 닫는 대괄호가 않습니다하지 첫 번째 위치에 놓으면 탈출해야합니다.

0

당신은 내부에 "아니오 괄호"제한 (이 정규 표현식으로 표현 쉬운) 더블 일치를 확인할 수 있습니다

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

(가지고에만 캡처 그룹)

0

I 하나만 (?<!\[)\[([^[] 브래킷을 사용하여 일치 항목을 찾을 수 있습니다.

link = r"((?<!\[)\[([^[].+?) \s*([|] \s* (.+?) \s*)?])" 
        ^
compLink = re.compile(link, re.X | re.U) 
0

"((?<!\[)\[을이 "((?<!\[)\[(?!\[)
으로 바꾸고 나머지 식은 그대로 둡니다.