2014-02-27 39 views
0

我試圖找到匹配[abc],但不是[[abc]]使用Python正則表達式。Python中的反向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

我可以通過只有一個(?<!\[)\[([^[]支架來找到匹配。

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

只需用這個零件"((?<!\[)\[替換爲"((?<!\[)\[(?!\[)
並且按原樣保留表達式的其餘部分。