import re
regex = re.compile(r"""
(\$)
# Regexp for textmate dynamic variables
#TM_(
# BUNDLE_SUPPORT|COMMENT_(?:END|MODE|START)|CURRENT_(?:LINE|WORD)|DIRECTORY|FILE(?:NAME|PATH)|
# LINE_(?:INDEX|NUMBER)|PROJECT_DIRECTORY|SCOPE|SELECTED_(?:FILE[S]?|TEXT)|SOFT_TABS|SUPPORT_PATH|TAB_SIZE
#)
(?:
# BASIC
# BASIC: Variable name, no brackets
(?:(TM_[A-Z]+(?:_[A-Z]+)*)|([\d]))(?!\{)
|
# BRACKETED
([\{])
# BRACKETED: Variable name
(?:(TM_[A-Z]+(?:_[A-Z]+)*)|([\d]))
# BRACKETED: Post variable name expression
(?:
# Default keyword, single
([:].+?(?=[\}]))
|
# Default keyword, options
([\|].+?[\|](?=[\}]))
|
# Regular expression
(?:
([\/])
(.+?(?=\/))
([\/])
(.+?(?=\/))
([\/])
# Flags
# Not sure how to validate fully without back references?
([imx]{3})
(?=\})
)
|
(?:
([\/])
([^\/\}]+?)
(
(?<![\\]{2})
[\/]
)
([^\/\}]+?)
(
(?<![\\]{2})
[\/]
)
# Flags
# Not sure how to validate fully without back references?
([imx]{3})
)
|
# Match to bracket
(.+?(?=[\}]))?
)?
([\}])
)
""", flags=re.MULTILINE | re.VERBOSE)
test_str = ("~~ Number Variables ~~~~~~~~~\n"
"Basic\n"
"\"$0\"\n"
"Bracketed\n"
"\"${1} \n"
"Default Value\n"
"\"${2:default}\"\n"
"Default Values\n"
"\"${3|defaultA,defaultB|}\"\n"
"Regex Replace\n"
"\"${4/find/replace/gmi}\"\n\n"
"~~ Dynamic Variables ~~~~~~~~\n"
"Basic\n"
"\"$TM_SELECTION_START\"\n"
"Bracketed\n"
"\"${TM_SELECTION_END}\"\n"
"Default Value\n"
"\"${TM_SELECTED_FILE:default}\"\n"
"Default Values\n"
"\"${TM_SELECTED_TEXT|defaultA,defaultB|}\"\n"
"Regex Replace\n"
"\"${TM_SELECTED_FILES/find/replace/gmi}\"\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