In [1]:
import re
In [2]:
class LatinString(str):
    
    def latin_upper(self, text):
        text = text.upper()
        text = re.sub('U', 'V', text)
        return text
    
    
    def latin_lower(self, text, strict=True):
        text = text.lower()
        if strict:
            text = re.sub('v', 'u', text)
        else:
            text = re.sub(r'([^aeiou])v([^aeiou])','\g<1>u\g<2>', text) # between two consonants
            text = re.sub(r'([cq])v([aeio])','\g<1>u\g<2>', text) # between q/c and vowel
            text = re.sub(r'v([^aeiou])', 'u\g<1>',text) # preceding consonant
        return text
In [3]:
latinstring = LatinString()
In [4]:
latinstring.latin_upper("salve")
Out[4]:
'SALVE'
In [5]:
latinstring.latin_lower('VERBVM')
Out[5]:
'uerbum'
In [6]:
latinstring.latin_lower('VERBVM', strict=False)
Out[6]:
'verbum'
In [7]:
latinstring.latin_lower('VBIQVE', strict=False)
Out[7]:
'ubique'
In [8]:
text = """Cui dono lepidum novum libellum 
arida modo pumice expolitum? 
Corneli, tibi: namque tu solebas 
meas esse aliquid putare nugas. 
Iam tum, cum ausus es unus Italorum 
omne aevum tribus explicare cartis... 
Doctis, Iuppiter, et laboriosis! 
Quare habe tibi quidquid hoc libelli— 
qualecumque, quod, o patrona virgo, 
plus uno maneat perenne saeclo!"""
In [9]:
TEXT = latinstring.latin_upper(text)
print(TEXT)
CVI DONO LEPIDVM NOVVM LIBELLVM 
ARIDA MODO PVMICE EXPOLITVM? 
CORNELI, TIBI: NAMQVE TV SOLEBAS 
MEAS ESSE ALIQVID PVTARE NVGAS. 
IAM TVM, CVM AVSVS ES VNVS ITALORVM 
OMNE AEVVM TRIBVS EXPLICARE CARTIS... 
DOCTIS, IVPPITER, ET LABORIOSIS! 
QVARE HABE TIBI QVIDQVID HOC LIBELLI— 
QVALECVMQVE, QVOD, O PATRONA VIRGO, 
PLVS VNO MANEAT PERENNE SAECLO!
In [10]:
print(latinstring.latin_lower(TEXT, strict=True))
cui dono lepidum nouum libellum 
arida modo pumice expolitum? 
corneli, tibi: namque tu solebas 
meas esse aliquid putare nugas. 
iam tum, cum ausus es unus italorum 
omne aeuum tribus explicare cartis... 
doctis, iuppiter, et laboriosis! 
quare habe tibi quidquid hoc libelli— 
qualecumque, quod, o patrona uirgo, 
plus uno maneat perenne saeclo!
In [11]:
print(latinstring.latin_lower(TEXT, strict=False))
cui dono lepidum novum libellum 
arida modo pumice expolitum? 
corneli, tibi: namque tu solebas 
meas esse aliquid putare nugas. 
iam tum, cum ausus es unus italorum 
omne aevum tribus explicare cartis... 
doctis, iuppiter, et laboriosis! 
quare habe tibi quidquid hoc libelli— 
qualecumque, quod, o patrona virgo, 
plus uno maneat perenne saeclo!