import re
regex = re.compile(r"^\[Error: +(?<source_path>(?<file>[^\s\n](?:[^\n:\\]+|\\.)+?)(?::(?<line>\d+)(?::(?<column>\d+)))?) *$", flags=re.MULTILINE)
test_str = ("/usr/local/lib/node_modules/stylus/bin/stylus:685\n"
" throw err;\n"
" ^\n\n"
"[Error: /Users/user/path/to/stylus/file/invalid.styl:34:5\n"
" 30| ==/UserStyle== */\n"
" 31| \n"
" 32| @-moz-document regexp(\"https?://(www\\\\.)?typescriptlang.org/(v2/)?docs.*$\"),\n"
" 33| regexp(\"https?://(www\\\\.)?(staging-)?typescript\\\\.org/docs/.*$\")\n"
" 34| error(\"compile error\")\n"
"-----------^\n"
" 35| \n\n"
"compile error\n"
"] {\n"
" fromStylus: true,\n"
" lineno: 34,\n"
" column: 5,\n"
" filename: '/Users/disk0/git.local/stylus-stylus/static/test/testFiles/invalid.styl',\n"
" stylusStack: '',\n"
" input: '/* ==UserStyle==\\n' +\n"
" '@name TypeScript Docs\\n' +\n"
" '@description Expands width of code blocks and moves navigation bar fully to the left\\n' +\n"
" '@version 0.0.12\\n' +\n"
" '@namespace github.com/disk0/stylus/typescript.org/docs\\n' +\n"
" '\\n' +\n"
" '@author disk0 (github.com/disco0)\\n' +\n"
" '@license MIT\\n' +\n"
" '\\n' +\n"
" '@preprocessor stylus\\n' +\n"
" '\\n' +\n"
" '@var select CodeFont \"Font for code displayed on page.\" [\\n' +\n"
" ' \"Iosevka Extended*\",\\n' +\n"
" ' \"Iosevka Expanded\",\\n' +\n"
" ' \"Iosevka Term\",\\n' +\n"
" ' \"Iosevka\",\\n' +\n"
" '\\n' +\n"
" ' \"SemanticHaskell\",\\n' +\n"
" ' \"SemanticJavascript\",\\n' +\n"
" ' \"SemanticCode\",\\n' +\n"
" ' \"Hasklig\",\\n' +\n"
" '\\n' +\n"
" ' \"PragmataPro Mono Liga\",\\n' +\n"
" '\\n' +\n"
" ' \"monospace\"\\n' +\n"
" ']\\n' +\n"
" '@var number CodeFontSize \"Size of code in documentation\" [ 14, 1, 500, 1, \"px\" ]\\n' +\n"
" '@var number CodeFontWeight \"Code font weight\" [ 400, 100, 900, 100 ]\\n' +\n"
" '@var number DocTextWidth \"Width of text content in documentation\" [ 1000, 300, 5000, 100, \"px\" ]\\n' +\n"
" '==/UserStyle== */\\n' +\n"
" '\\n' +\n"
" '@-moz-document regexp(\"https?://(www\\\\\\\\.)?typescriptlang.org/(v2/)?docs.*$\"),\\n' +\n"
" '\\t regexp(\"https?://(www\\\\\\\\.)?(staging-)?typescript\\\\\\\\.org/docs/.*$\")\\n' +\n"
" ' error(\"compile error\")\\n'\n"
"}\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