# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility
import re
regex = r"""
(?<=[ \t])-?
(?:
(?:
\d
|[1-9]\d+
|[1-9]\d*\.\d{1,3}(?<!0)
|\.\d{1,3}(?<!0)
)|(?:
(\.0*)0
|(0+)\.\d{0,2}[1-9]
|(0+)(?:0|[1-9]\d*)\.?\d*
|\d+(\.0*)
|\d*\.(?:[1-9]|\d[1-9])?(0+)
|\d*\.\d{3}(\d+)
)
)
(?=[ \t]|$)[ \t]?
"""
test_str = ("Valid:\n"
"* Integers\n"
" 0 1 10 123\n"
" -0 -1 -10 -123\n"
"* Floats <1, without leading zero, (1<=precision<=3)\n"
" .1 .01 .001 .12 .123\n"
" -.1 -.01 -.001 -.12 -.123\n"
"* Floats >1, (1<=precision<=3)\n"
" 1.1 1.01 1.001 1.12 1.123 12.1 12.12 12.123 123.1 123.12 123.123\n"
" -1.1 -1.01 -1.001 -1.12 -1.123 -12.1 -12.12 -12.123 -123.1 -123.12 -123.123\n\n"
"Invalid (in order of capture):\n"
"* [1] Zero as float with only trailing zeros\n"
" .0 .00 .000\n"
" -.0 -.00 -.000\n"
"* [2] Floats <1, with leading zero\n"
" 0.1 0.01 0.001 0.12 0.123\n"
" -0.1 -0.01 -0.001 -0.12 -0.123\n"
"* [3] Integers with leading zeros\n"
" 00 01 012 0123 000 001 0012 00123 0000 0001 00012 000123\n"
" -00 -01 -012 -0123 -000 -001 -0012 -00123 -0000 -0001 -00012 -000123\n"
"* [4] Integers as float ('fake floats')\n"
" 0. 1. 12. 123.\n"
" 0.0 0.00 0.000 0.0000\n"
" 1.0 1.00 1.000\n"
" -0. -1. -12. -123.\n"
" -0.0 -0.00 -0.000 -0.0000\n"
" -1.0 -1.00 -1.000\n"
"* [5] Floats with trailing zeros\n"
" 1.10 1.100 1.120 .10 .100 .120\n"
" -1.10 -1.100 -1.120 -.10 -.100 -.120\n"
"* [6] Any float with precision >3\n"
" 0.0001 0.0012 0.0123 0.1234\n"
" 1.0001 1.0012 1.0123 1.1234\n"
" 10.0001 10.0012 10.0123 10.1234\n"
" 100.0001 100.0012 100.0123 100.1234\n"
" -0.0001 -0.0012 -0.0123 -0.1234\n"
" -1.0001 -1.0012 -1.0123 -1.1234\n"
" -10.0001 -10.0012 -10.0123 -10.1234\n"
" -100.0001 -100.0012 -100.0123 -100.1234\n")
matches = re.finditer(regex, test_str, re.VERBOSE | re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
for groupNum in range(0, len(match.groups())):
groupNum = groupNum + 1
print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))
# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
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