import re
regex = re.compile(r"@param\s+\{\(?([^}]+)\)?\}\s+(\[.+\]|[\w]+(?:\[.+\])?)\s+([\s\S]*?)(?=\@|\*\/)", flags=re.IGNORECASE | re.MULTILINE)
test_str = ("/**\n"
" * Removes elements from \\`array\\` corresponding to \\`indexes\\` and returns an\n"
" * array of removed elements.\n"
" *\n"
" * **Note:** Unlike \\`_.at\\`, this method mutates \\`array\\`.\n"
" *\n"
" * @static\n"
" * @memberOf _\n"
" * @category Array\n"
" * @param {Array} array The array to modify.\n"
" * @param {...(number|number[])} [indexes] The indexes of elements to remove,\n"
" * specified individually or in arrays.\n"
" * @returns {Array} Returns the new array of removed elements.\n"
" * @example\n"
" *\n"
" * var array = [5, 10, 15, 20];\n"
" * var evens = _.pullAt(array, 1, 3);\n"
" *\n"
" * console.log(array);\n"
" * // => [5, 15]\n"
" *\n"
" * console.log(evens);\n"
" * // => [10, 20]\n"
" */\n"
"var pullAt = rest(function(array, indexes) {\n"
" indexes = arrayMap(baseFlatten(indexes), String);\n\n"
" var result = baseAt(array, indexes);\n"
" basePullAt(array, indexes.sort(compareAscending));\n"
" return result;\n"
"});")
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