# BENCHMARK  -  Python convertir un string en CamelCase a separados por guiones
# http://es.stackoverflow.com/a/61561/127

import cProfile, pstats, io, string
import re


patron = r"[A-Z]\d*(?:[A-Z\d]*(?=[A-Z]|$)|[a-z])"
pascal = re.compile(patron)
def pascal_kebab(cadena):
	return pascal.sub(lambda m: ("-" if m.start() else "") + m.group().lower(), cadena)


pattP = re.compile(r'(.)([A-Z][a-z]+)')
pattF = re.compile('([a-z0-9])([A-Z])')
def camel_a_guiones(cadena):
	return pattF.sub(r'\1-\2', pattP.sub(r'\1-\2', cadena)).lower()

patt = re.compile(r'.+?(?:(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|$)')
def camel_a_guiones_iter(cadena):
	return '-'.join(m.group(0) for m in re.finditer(patt, cadena)).lower()


pruebas = ['VerHTMLDePag', 'Ver2HTMLDePag', 'Ver2HTMLPag2Info', 'HTMLFomatoPag', 'HTMLConXML',
           'HTML5FomatoPag', 'HTML5ConXML', 'HTML5ConCSS3', 'HTML', 'VerQ', 'A2BFormato',
           'Formato', 'SFormato' ]
          
          

pr = cProfile.Profile()
pr.enable()
for i in range(36000):
	for prueba in pruebas:
		pascal_kebab(prueba)
		camel_a_guiones(prueba)
		camel_a_guiones_iter(prueba)
pr.disable()
s = io.StringIO()
sortby = 'cumulative'
ps = pstats.Stats(pr, stream=s).strip_dirs().sort_stats(sortby).reverse_order()
ps.print_stats('pascal_kebab|camel_a_guiones')
print(s.getvalue())