This expression is also likely to work:
(\[\[[^\]]*\]\]\([^)]*\))
Test with re.findall
import re
regex = r"(\[\[[^\]]*\]\]\([^)]*\))"
test_str = """
this is the [[sample1]] string [[sample1]](explanation) this is the [[sample1]] string
[[sample2]](explanation1) [[]]()
[[sample3]](explanation1) [[sample4]]()
"""
print(re.findall(regex, test_str, re.M))
Output
['[[sample1]](explanation)', '[[sample2]](explanation1)', '[[]]()', '[[sample3]](explanation1)', '[[sample4]]()']
The expression is explained on the top right panel of regex101.com, if you wish to explore/simplify/modify it, and in this link, you can watch how it would match against some sample inputs, if you like.
RegEx Circuit
jex.im visualizes regular expressions:

sample2contain[or]? Canexplanationcontain(or)?