import re
regex = re.compile(r"^[ \t]*([0]|([-+]?(\d*\.)?\d+)(cm|mm|in|px|pt|pc|Q|em|ex|ch|rem|vw|vh|vmin|vmax|%)){1}([\t ]+([0]|([-+]?(\d*\.)?\d+)(cm|mm|in|px|pt|pc|Q|em|ex|ch|rem|vw|vh|vmin|vmax|%))){0,3}[\t ]*$", flags=re.MULTILINE)
test_str = ("0\n"
" 0 \n"
"0px\n"
" 0px 0px 0px 0\n"
"0 0\n"
" 0cm 0px 0ch 0% \n"
" 0 0 \n"
"0 0 0\n"
" 0 0 0 \n"
"0 0 0 0\n"
"2px 0\n"
"+2px\n"
"-3px\n"
"0 2px\n"
" 3cm \n"
"0px\n"
"0px 0px 0px\n"
" 1px \n"
" 2px 2px \n"
" 3px 3px 3px \n"
" 4px 4px 4px 4px \n"
"+4px -4px -4px +4px \n"
"-1px \n"
" -2px -2px \n"
" -3px -3px -3px \n"
" -4px -4px -4px -4px \n"
"1% \n"
" 2% 2vh \n"
" 3vw 3vh 3% \n"
" 4cm 4pt -4vmin 4vmax \n\n"
"# Errors - must not match\n"
" \n"
"00\n"
"0 0px 00 \n"
"1px-2px \n"
" 2px2px \n"
" 3pxf 3px 3px sdsd\n"
" 4px-4px 4px 4px \n"
"4px4px4px4px \n"
"4px 4px 4px 4-px \n"
"-4px-4px-4px-4px \n"
"--3px\n"
"+-3px\n"
"-4px-4px -4px- 4px \n"
"-4\n"
"+5\n"
"+0px -0\n"
"+0")
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