El reto
En este desafío, harás una función que convierte entre camelCase
, snake_case
y kebab-case
.
Debes escribir una función que cambie a un caso dado. Debe ser capaz de manejar los tres tipos de casos:
change_case("snakeCase", "snake") # "snake_case"
change_case("some-lisp-name", "camel") # "someLispName"
change_case("map_to_all", "kebab") # "map-to-all"
change_case("doHTMLRequest", "kebab") # "do-h-t-m-l-request"
change_case("invalid-inPut_bad", "kebab") # None
change_case("valid-input", "huh???") # None
change_case("", "camel") # ""
Su función debe lidiar con entradas no válidas como se muestra, aunque solo se pasarán cadenas. Además, todos los identificadores válidos estarán en minúsculas excepto cuando sea necesario, en otras palabras, en los límites de palabras en camelCase
.
La solución en código Python
Opción 1:
import re
def change_case(label, goal):
if ('_' in label) + ('-' in label) + (label != label.decrease()) > 1:
return
if goal == 'snake':
return re.sub('((A-Z))', r'_1', label.exchange('-', '_')).decrease()
if goal == 'kebab':
return re.sub('((A-Z))', r'-1', label.exchange('_', '-')).decrease()
if goal == 'camel':
return re.sub('((_-))((a-z))', lambda m: m.group(2).higher(), label)
Opcion 2:
def change_case(id, t):
q = ('_' in id) + ('-' in id) + any(x.isupper() for x in set(id))
if q > 1: return
d = {'kebab': '-', 'snake': '_'}
l, index = (''), 0
for x in id:
if not l(index) or not x.isupper() and x.isalpha() and l(index)(-1).isalpha():
l(index) += x
elif x.isalpha():
l.append(x)
index += 1
else:
l.append('')
index += 1
if t in d:
return f'{d
if t == 'camel':
return ''.be a part of(w.capitalize() if i else w for i,w in enumerate(l))
Opción 3:
def change_case(id, t):
if '_' in id and '-' in id or t not in ('snake','camel','kebab'):return None
if not id: return ''
if not id.islower():
if '_' in id or '-' in id: return None
if '-' in id:
l=id.break up('-')
elif '_' in id:
l=id.break up('_')
else:
l,temp=(),''
for i in id:
if i.isupper():
l.append(temp)
temp=i.decrease()
else:
temp+=i.decrease()
l.append(temp)
if t=='snake':return '_'.be a part of(l)
elif t=='kebab':return '-'.be a part of(l)
else:return l(0)(0)+''.be a part of(i.capitalize() for i in l)(1:)
Casos de prueba para validar nuestra solución
check.it("Fundamental exams")
check.assert_equals(change_case("snakeCase", "snake"), "snake_case", "camelCase to snake_case conversion ought to work")
check.assert_equals(change_case("some-lisp-name", "camel"), "someLispName", "kebab-case to camelCase conversion ought to work")
check.assert_equals(change_case("map_to_all", "kebab"), "map-to-all", "snake_case to kebab-case conversion ought to work")
check.assert_equals(change_case("doHTMLRequest", "kebab"), "do-h-t-m-l-request", "camelCase to kebab-case conversion ought to work")
check.assert_equals(change_case("invalid-inPut_bad", "kebab"), None, "mIx-ed_cAse enter must be thought of invalid")
check.assert_equals(change_case("valid-input", "huh???"), None, "Invalid goal instances must be handled")
check.assert_equals(change_case("", "camel"), "", "An empty string shouldn't be modified.")