Ответ Игнасио, вероятно, лучший способ справиться с этим, но если вы не используете Python 2.6, вы можете создать функцию, которая делает вещи немного проще, не полагаясь на регулярные выражения. Вот простая и не очень надежная версия, которую я скинул вместе:
def parse_fraction(fraction):
def parse_part(part):
sections = part.split('/')
if len(sections) == 1:
return float(sections[0])
return float(sections[0]) / float(sections[1])
return sum( parse_part(part) for part in fraction.split() )
Это, очевидно, не идеально, потому что он по-прежнему будет принимать ввод, такой как '2 1/2 1/2'
, который он будет оценивать как 3
, так как он по существу суммирует список чисел с разделителями пробелами, оценивая каждое как дробь по мере необходимости.
если вы придерживаетесь решения на основе регулярных выражений, вы должны знать, что вы можете использовать необработанную строку, чтобы избежать двойной обратной косой черты. По сути, вы можете написать:
mixednum = re.compile(r"(\d+) (\d+)/(\d+)")
r
перед строкой говорит Python не оценивать специальные символы в строке, поэтому вы можете писать буквальные обратные слэши, и они будут рассматриваться как таковые. Также обратите внимание, что вам не нужно экранировать косую черту, поскольку она не является специальным символом в регулярных выражениях Python (поскольку она не используется для обозначения границ литерального регулярного выражения, как во многих языках). флаг re.IGNORECASE
также не имеет большого смысла, поскольку он включает в себя только числовые объекты в регулярном выражении, а re.DOTALL
также не имеет смысла, поскольку у вас нет точек, к которым он может применяться.