1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| # -*- coding: utf-8 -*-
#!/usr/bin/env python
import re
from fractions import Fraction
# The following pattern commes from the book "Dive into Python".
# It will be use to test if a text is a valid roman number.
PATTERN_ROMAN_NUMERAL = re.compile('''
^ # beginning of string
M{0,4} # thousands - 0 to 4 M's
(CM|CD|D?C{0,3}) # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
# or 500-800 (D, followed by 0 to 3 C's)
(XC|XL|L?X{0,3}) # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
# or 50-80 (L, followed by 0 to 3 X's)
(IX|IV|V?I{0,3}) # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
# or 5-8 (V, followed by 0 to 3 I's)
$ # end of string
''' ,re.VERBOSE)
def isRational(stringToTest):
try:
Fraction(stringToTest)
return True
except:
return False
dico = dict(zip(((True,False,False),(False,True, True),(False,False,True),(False,False,False)),\
(' est un nombre romain',' est un entier',' est un rationnel',\
" n'est ni un nombre romain, ni un entier, ni un rationnel")))
###############
###############
## ##
## FOR TESTS ##
## ##
###############
###############
if __name__ == '__main__':
li = ['XVI','435','4/5','123.667','bigoudi']
for u in li:
print u + dico[bool(PATTERN_ROMAN_NUMERAL.match(u)),u.isdigit(),isRational(u)] |
Partager