需要匹配模式:[[ : ]]
,
我这样做:\[\[(?!\[\[).[:]+.*?\]\]
但是当模式具有许多相同模式的环境时:[[:]] [[ [] ]] [[]] [[ : ]] [[ : ]]
匹配失败,并返回:[[:]],[[:]]
或者如果正则表达式是:\[\[.*?[:]+.*?\]\]
,给出:
[[ [] ]] [[]] [[ : ]] instead of [[ : ]]
真正的方法是什么?
当你必须匹配[[ : ]]
类似的字符串时,你应首先匹配[[
,然后任何不是:
的0 +字符并且不启动前导/后续序列,即[[
和]]
,那么你需要匹配:
字符,然后任何0+字符到]]
的第一个(最左边)出现。
您可以使用的模式是
\[\[(?:(?!\[\[|]])[^:])*:.*?]]
见regex demo。记得使用re.DOTALL
或re.S
为.
匹配多行。
细节
\[\[
- 一个[[
子串(?:(?!\[\[|]])[^:])*
- tempered greedy token匹配除:
之外的任何其他字符(参见[^:]
否定字符类),0次(参见*
),这不会启动[[
和]]
序列:
- 一个冒号.*?
- 任何0+字符,尽可能少]]
- 一个]]
子串。