Python中的负面lookbehind断言

时间:2014-02-27 19:25:28

标签: python regex

我正在尝试使用Python正则表达式找到匹配[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')]

如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

你可以试试这个:

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

内容在第1组或第2组

注意:此处不需要重新选项。

如果您只需要提取最深的方括号,这些模式就足够了:

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

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

请注意,如果将字符类放在第一个位置,则不需要转义字符类中的右方括号。

答案 1 :(得分:0)

您可以将内部限制为“无括号”并检查匹配的double(这更容易表示为正则表达式):

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

(仅采取捕获的组)

答案 2 :(得分:0)

我只能通过一个(?<!\[)\[([^[]括号找到匹配项。

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

答案 3 :(得分:0)

只需将此部分"((?<!\[)\[替换为此"((?<!\[)\[(?!\[)
并保留表达式的其余部分。