# 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())
IyBCRU5DSE1BUksgIC0gIFB5dGhvbiBjb252ZXJ0aXIgdW4gc3RyaW5nIGVuIENhbWVsQ2FzZSBhIHNlcGFyYWRvcyBwb3IgZ3Vpb25lcwojIGh0dHA6Ly9lcy5zdGFja292ZXJmbG93LmNvbS9hLzYxNTYxLzEyNwoKaW1wb3J0IGNQcm9maWxlLCBwc3RhdHMsIGlvLCBzdHJpbmcKaW1wb3J0IHJlCgoKcGF0cm9uID0gciJbQS1aXVxkKig/OltBLVpcZF0qKD89W0EtWl18JCl8W2Etel0pIgpwYXNjYWwgPSByZS5jb21waWxlKHBhdHJvbikKZGVmIHBhc2NhbF9rZWJhYihjYWRlbmEpOgoJcmV0dXJuIHBhc2NhbC5zdWIobGFtYmRhIG06ICgiLSIgaWYgbS5zdGFydCgpIGVsc2UgIiIpICsgbS5ncm91cCgpLmxvd2VyKCksIGNhZGVuYSkKCgpwYXR0UCA9IHJlLmNvbXBpbGUocicoLikoW0EtWl1bYS16XSspJykKcGF0dEYgPSByZS5jb21waWxlKCcoW2EtejAtOV0pKFtBLVpdKScpCmRlZiBjYW1lbF9hX2d1aW9uZXMoY2FkZW5hKToKCXJldHVybiBwYXR0Ri5zdWIocidcMS1cMicsIHBhdHRQLnN1YihyJ1wxLVwyJywgY2FkZW5hKSkubG93ZXIoKQoKcGF0dCA9IHJlLmNvbXBpbGUocicuKz8oPzooPzw9W2EtejAtOV0pKD89W0EtWl0pfCg/PD1bQS1aXSkoPz1bQS1aXVthLXpdKXwkKScpCmRlZiBjYW1lbF9hX2d1aW9uZXNfaXRlcihjYWRlbmEpOgoJcmV0dXJuICctJy5qb2luKG0uZ3JvdXAoMCkgZm9yIG0gaW4gcmUuZmluZGl0ZXIocGF0dCwgY2FkZW5hKSkubG93ZXIoKQoKCnBydWViYXMgPSBbJ1ZlckhUTUxEZVBhZycsICdWZXIySFRNTERlUGFnJywgJ1ZlcjJIVE1MUGFnMkluZm8nLCAnSFRNTEZvbWF0b1BhZycsICdIVE1MQ29uWE1MJywKICAgICAgICAgICAnSFRNTDVGb21hdG9QYWcnLCAnSFRNTDVDb25YTUwnLCAnSFRNTDVDb25DU1MzJywgJ0hUTUwnLCAnVmVyUScsICdBMkJGb3JtYXRvJywKICAgICAgICAgICAnRm9ybWF0bycsICdTRm9ybWF0bycgXQogICAgICAgICAgCiAgICAgICAgICAKCnByID0gY1Byb2ZpbGUuUHJvZmlsZSgpCnByLmVuYWJsZSgpCmZvciBpIGluIHJhbmdlKDM2MDAwKToKCWZvciBwcnVlYmEgaW4gcHJ1ZWJhczoKCQlwYXNjYWxfa2ViYWIocHJ1ZWJhKQoJCWNhbWVsX2FfZ3Vpb25lcyhwcnVlYmEpCgkJY2FtZWxfYV9ndWlvbmVzX2l0ZXIocHJ1ZWJhKQpwci5kaXNhYmxlKCkKcyA9IGlvLlN0cmluZ0lPKCkKc29ydGJ5ID0gJ2N1bXVsYXRpdmUnCnBzID0gcHN0YXRzLlN0YXRzKHByLCBzdHJlYW09cykuc3RyaXBfZGlycygpLnNvcnRfc3RhdHMoc29ydGJ5KS5yZXZlcnNlX29yZGVyKCkKcHMucHJpbnRfc3RhdHMoJ3Bhc2NhbF9rZWJhYnxjYW1lbF9hX2d1aW9uZXMnKQpwcmludChzLmdldHZhbHVlKCkp