«
Unicode and vulgar fractions
»
This little snippet will scan a block of text and replace fractions with the unicode vulgar fraction equivalent when possible, removing spaces if the fraction is immediately after another number. For example "1 1/2" will be replaced by "1½".
import re
FRACRE = re.compile(ur'(\d\ +)?(\d+/\d+)\b')
FRACTIONS = {
u'1/2' : u'\u00BD',
u'1/4' : u'\u00BC',
u'3/4' : u'\u00BE',
u'1/3' : u'\u2153',
u'2/3' : u'\u2154',
u'1/5' : u'\u2155',
u'2/5' : u'\u2156',
u'3/5' : u'\u2157',
u'4/5' : u'\u2158',
u'1/6' : u'\u2159',
u'5/6' : u'\u215A',
u'1/8' : u'\u215B',
u'3/8' : u'\u215C',
u'5/8' : u'\u215D',
u'7/8' : u'\u215E',
}
def fractions(s):
def subfrac(m):
pre, post = m.groups()
frac = FRACTIONS.get(post)
if frac is None:
start, end = m.span()
return m.string[start:end]
if pre is not None:
frac = pre[0] + frac
return frac
return FRACRE.sub(subfrac, s)