import re
regex = re.compile(r"(?<!\\)(?:\[{2}[^\n|]+(?:\|[^\n]+)?]]|\[[^\n]+]\([^\n:]+\))")
test_str = ("[[Link name|title]]\n\n"
"[[Link name]]\n\n"
"[[do not\n"
"|match]]\n"
"[I am not a link]]\n"
"some (text) [[Link]] more [text]\n\n"
"\\[[This is not a link]]\\[[[this is|a link]] foo bar ]\n\n"
"[[Folder Name/Link|link]]\n\n"
"[[Folder/other folder/file|label]]\n\n"
"[[]]\n"
"[[A [link] with brackets]]\n\n"
"[[A [link] with brackets|on [both] sides]]\n\n"
"[[A [bracket] folder/A [link] with brackets|on [both] sides]]\n\n"
"Markdown: [Three laws of motion](Three%20laws%20of%20motion.md)\n\n"
"\\[Not a link](Three%20laws%20of%20motion.md)\n\n"
"[also\n"
"not](a link)\n\n"
"[This [is] a link](Three%20laws%20of%20motion.md)\n\n"
"[Yes, you can put (parens) and [brackets] in a filename](Yes,%20you%20can%20put%20(parens)%20and%20[brackets]%20in%20a%20filename)\n\n"
"[This is an external link](https://regex101.com)\n\n"
" [[#Preview a linked file]] is a link to a heading in the current document.\n\n"
" [[Obsidian#Links are first-class citizens]] is a link to a heading in another document.\n\n"
"[[Help and support#Questions and advice#Report bugs and request features]] is a link to a subheading in another document.\n\n"
"You can link to a block by adding #^ at the end of your link destination followed by a unique block identifier. For example, [[2023-01-01#^37066d]]")
matches = regex.finditer(test_str)
for match_num, match in enumerate(matches, start=1):
print(f"Match {match_num} was found at {match.start()}-{match.end()}: {match.group()}")
for group_num, group in enumerate(match.groups(), start=1):
print(f"Group {group_num} found at {match.start(group_num)}-{match.end(group_num)}: {group}")
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Python, please visit: https://docs.python.org/3/library/re.html