У меня есть несколько фиктивных имен функций, и я хочу преобразовать их следующим образом:
пример 1
input : getDataType
output: Data_Type
пример 2
input: getDatasetID
output: Dataset_ID
Мой код выглядит следующим образом:
def apiNames(funcName):
name = funcName.split("get")[1]
print(''.join('_' + char if char.isupper() else char
for char in name).lstrip('_'))
apiNames("getDataType")
apiNames("getDatasetID")
это работает для случая 1, но не для случая 2
случай 1 Выход:
Data_Type
случай 2 Выход:
Dataset_I_D
Вы ищете способ разбить строку, например getDataType
, на заглавные буквы и вставить символ подчеркивания, или вы действительно хотите вызывать существующие функции под другим именем?
Это известный список? Вы можете использовать словарь, который сопоставляет старое с новым. Это легко. Или вы обычно пытаетесь преобразовать вещи, соответствующие шаблону getSomething
? Немного сложнее.
@alexis, я хочу вставлять подчеркивание, когда он находит заглавную букву, но не при последовательной заглавной букве, как показано в примере
Что, если у вас есть переменная getDatasetIDOrder
, которая возвращает порядок идентификаторов набора данных? У вас не всегда будут последовательные заглавные буквы в конце, поэтому вам нужно подумать, что произойдет тогда.
Я думаю, что регулярное выражение - лучший способ решить эту проблему.
Учитывать:
def apiNames(funcName):
name = funcName.split("get")[1]
print('_'.join([found for found in re.findall(r'[A-Z]*[a-z]*', name)][:-1]))
это отлично подходит для моих требований, но да, есть много угловых случаев, поэтому мне приходится иметь дело с ними отдельно... спасибо за ответ. ваше здоровье
Имеет смысл. Часто люди спрашивают, как разбить адресные строки на их компоненты. Это звучит как аналогичное требование. Смерть от тысячи крайних случаев. Я считаю, что использование регулярных выражений упростит написание шаблонов для различных пограничных случаев вместо того, чтобы полагаться на более жесткие функции, такие как split()
.
Просто для удовольствия, вот более надежный camelCASEParser
, который позаботится обо всех «угловых случаях». Немного взгляда вперед имеет большое значение.
>>> pattern = '^[a-z]+|[A-Z][a-z]+|[A-Z]+(?![a-z])'
>>> "_".join(re.findall(pattern, "firstWordsUPPERCASECornerCasesEtc"))
'first_Words_UPPERCASE_Corner_Cases_Etc'
И да, это также работает, если шаблон заканчивается пробелом в верхнем регистре. Отрицательный просмотр вперед завершается успешно в конце строки.
>>> "_".join(re.findall(pattern, "andAShortPS"))
'and_A_Short_PS'
Я почти уверен, что это работает для любого соответствия последовательности ^[a-zA-Z]+
. Попробуй это.
Я удивлен, что это решение работает, как и ожидалось, даже для многих угловых случаев. Ура
Хорошо для вас, хотя я бы рекомендовал следовать PEP 8 -- Руководство по стилю для кода Python для именования. Но каков ваш фактический вопрос?