Как изменить имена на некоторые дружественные имена в python?

У меня есть несколько фиктивных имен функций, и я хочу преобразовать их следующим образом:

пример 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

Хорошо для вас, хотя я бы рекомендовал следовать PEP 8 -- Руководство по стилю для кода Python для именования. Но каков ваш фактический вопрос?

MattDMo 05.04.2023 16:47

Вы ищете способ разбить строку, например getDataType, на заглавные буквы и вставить символ подчеркивания, или вы действительно хотите вызывать существующие функции под другим именем?

alexis 05.04.2023 16:47

Это известный список? Вы можете использовать словарь, который сопоставляет старое с новым. Это легко. Или вы обычно пытаетесь преобразовать вещи, соответствующие шаблону getSomething? Немного сложнее.

tdelaney 05.04.2023 16:48

@alexis, я хочу вставлять подчеркивание, когда он находит заглавную букву, но не при последовательной заглавной букве, как показано в примере

Sushant Shelke 05.04.2023 16:52

Что, если у вас есть переменная getDatasetIDOrder, которая возвращает порядок идентификаторов набора данных? У вас не всегда будут последовательные заглавные буквы в конце, поэтому вам нужно подумать, что произойдет тогда.

Sembei Norimaki 05.04.2023 17:08
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
5
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, что регулярное выражение - лучший способ решить эту проблему.

Учитывать:

def apiNames(funcName):
    name = funcName.split("get")[1]

    print('_'.join([found for found in re.findall(r'[A-Z]*[a-z]*', name)][:-1]))

это отлично подходит для моих требований, но да, есть много угловых случаев, поэтому мне приходится иметь дело с ними отдельно... спасибо за ответ. ваше здоровье

Sushant Shelke 05.04.2023 17:11

Имеет смысл. Часто люди спрашивают, как разбить адресные строки на их компоненты. Это звучит как аналогичное требование. Смерть от тысячи крайних случаев. Я считаю, что использование регулярных выражений упростит написание шаблонов для различных пограничных случаев вместо того, чтобы полагаться на более жесткие функции, такие как split().

JNevill 05.04.2023 17:44
Ответ принят как подходящий

Просто для удовольствия, вот более надежный 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]+. Попробуй это.

Я удивлен, что это решение работает, как и ожидалось, даже для многих угловых случаев. Ура

Sushant Shelke 08.04.2023 14:00

Другие вопросы по теме