我正在尝试使用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')]
如何解决这个问题?
答案 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)
只需将此部分"((?<!\[)\[
替换为此"((?<!\[)\[(?!\[)
并保留表达式的其余部分。