return -2 if result == -1 else result
_RATIONAL_FORMAT = re.compile(r"""
- \A\s* # optional whitespace at the start,
- (?P<sign>[-+]?) # an optional sign, then
- (?=\d|\.\d) # lookahead for digit or .digit
- (?P<num>\d*|\d+(_\d+)*) # numerator (possibly empty)
- (?: # followed by
- (?:\s*/\s*(?P<denom>\d+(_\d+)*))? # an optional denominator
- | # or
- (?:\.(?P<decimal>d*|\d+(_\d+)*))? # an optional fractional part
- (?:E(?P<exp>[-+]?\d+(_\d+)*))? # and optional exponent
+ \A\s* # optional whitespace at the start,
+ (?P<sign>[-+]?) # an optional sign, then
+ (?=\d|\.\d) # lookahead for digit or .digit
+ (?P<num>\d*|\d+(_\d+)*) # numerator (possibly empty)
+ (?: # followed by
+ (?:\s*/\s*(?P<denom>\d+(_\d+)*))? # an optional denominator
+ | # or
+ (?:\.(?P<decimal>\d*|\d+(_\d+)*))? # an optional fractional part
+ (?:E(?P<exp>[-+]?\d+(_\d+)*))? # and optional exponent
)
- \s*\Z # and optional whitespace to finish
+ \s*\Z # and optional whitespace to finish
""", re.VERBOSE | re.IGNORECASE)
self.assertRaisesMessage(
ValueError, "Invalid literal for Fraction: '1.1e+1__1'",
F, "1.1e+1__1")
+ self.assertRaisesMessage(
+ ValueError, "Invalid literal for Fraction: '123.dd'",
+ F, "123.dd")
+ self.assertRaisesMessage(
+ ValueError, "Invalid literal for Fraction: '123.5_dd'",
+ F, "123.5_dd")
+ self.assertRaisesMessage(
+ ValueError, "Invalid literal for Fraction: 'dd.5'",
+ F, "dd.5")
+ self.assertRaisesMessage(
+ ValueError, "Invalid literal for Fraction: '7_dd'",
+ F, "7_dd")
+ self.assertRaisesMessage(
+ ValueError, "Invalid literal for Fraction: '1/dd'",
+ F, "1/dd")
+ self.assertRaisesMessage(
+ ValueError, "Invalid literal for Fraction: '1/123_dd'",
+ F, "1/123_dd")
+ self.assertRaisesMessage(
+ ValueError, "Invalid literal for Fraction: '789edd'",
+ F, "789edd")
+ self.assertRaisesMessage(
+ ValueError, "Invalid literal for Fraction: '789e2_dd'",
+ F, "789e2_dd")
# Test catastrophic backtracking.
val = "9"*50 + "_"
self.assertRaisesMessage(