Пример:
>>> convert('CamelCase')
'camel_case'
python
camelcasing
Шридхар Ратнакумар
источник
источник
NotCamelCase
ноthisIs
Ответы:
Верблюжий кейс для змей
Если вы делаете это много раз, а вышеприведенное медленно, скомпилируйте регулярное выражение заранее:
Специально для обработки более сложных случаев (это уже необратимо):
Змеиный кейс для верблюда
источник
not_camel_case
вnotCamelCase
и / илиNotCamelCase
?s2.replace('__', '_')
В индексе пакета есть библиотека перегибов, которая может обработать эти вещи для вас. В этом случае вы будете искать
inflection.underscore()
:источник
Я не знаю, почему все это так сложно.
в большинстве случаев простое выражение
([A-Z]+)
поможетЧтобы игнорировать первый символ, просто добавьте взгляд позади
(?!^)
Если вы хотите отделить ALLCaps от all_caps и ожидать чисел в вашей строке, вам все равно не нужно выполнять два отдельных запуска, просто используйте
|
это выражение, которое((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))
может обрабатывать практически все сценарии в книгеВсе зависит от того, что вы хотите, поэтому используйте решение, которое наилучшим образом соответствует вашим потребностям, поскольку оно не должно быть слишком сложным.
NJoy!
источник
(?!^)
выражением, которое называли «оглядывающимся сзади». Если я чего-то не упустил, то, что мы действительно хотим здесь, это негативный взгляд, который должен быть выражен как(?<!^)
. По причинам, которые я не могу понять, твой негативный прогноз,(?!^)
похоже, тоже работает ..."Camel2WARNING_Case_CASE"
становится"camel2_warning_case__case"
. Вы можете добавить(?<!_)
отрицательный взгляд назад, чтобы решить:re.sub('((?<=[a-z0-9])[A-Z]|(?!^)(?<!_)[A-Z](?=[a-z]))', r'_\1', "Camel2WARNING_Case_CASE").lower()
возвращение'camel2_warning_case_case'
(?!^)
неправильно были названы «взглядом позади», и вместо этого должны были быть названы негативным прогнозом . Как показывает это приятное объяснение , негативные взгляды обычно появляются после искомого выражения. Таким образом, вы можете думать(?!^)
как «найти,''
где<start of string>
не следует». В самом деле, отрицательный взгляд также работает: вы можете думать,(?<!^)
как «найти,''
где<start of string>
не предшествует».stringcase - моя библиотека для этого; например:
источник
Я предпочитаю избегать,
re
если возможно:источник
re
библиотеку и не выполняет всю работу в одну строку, используя только встроенные методы str.methods! Это похоже на этот ответ , но избегает использования нарезки и дополнительныхif ... else
, просто убирая потенциально добавленный «_» в качестве первого символа. Мне это нравится больше всего.6.81 µs ± 22.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
но за этот ответ,2.51 µs ± 25.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
который в 2,5 раза быстрее! Люблю это!Лично я не уверен, что что-либо, использующее регулярные выражения в python, может быть описано как элегантное. Большинство ответов здесь просто делают трюки типа «Code Golf» типа RE. Предполагается, что элегантное кодирование легко понять.
источник
+=
на струнах это почти всегда плохая идея. Добавить в список и''.join()
это в конце. Или в этом случае просто присоединитесь к нему с подчеркиванием ...источник
Я думаю, что это решение является более простым, чем предыдущие ответы:
Какие выводы:
Регулярное выражение соответствует трем шаблонам:
[A-Z]?[a-z]+
Последовательные строчные буквы, которые необязательно начинаются с заглавной буквы.[A-Z]{2,}(?=[A-Z][a-z]|\d|\W|$)
: Две или более последовательных заглавных буквы. Он использует заглядывание, чтобы исключить последнюю заглавную букву, если за ней следует строчная буква.\d+
: Последовательные номера.Используя,
re.findall
мы получаем список отдельных «слов», которые можно преобразовать в нижний регистр и объединить с подчеркиванием.источник
Я не понимаю, зачем использовать оба вызова .sub ()? :) Я не гуру регулярных выражений, но я упростил функцию до этой, которая подходит для моих определенных потребностей, мне просто нужно решение для преобразования camelCasedVars из запроса POST в vars_with_underscore:
Он не работает с такими именами, как getHTTPResponse, потому что я слышал, что это плохое соглашение об именах (должно быть, как getHttpResponse, очевидно, что эту форму гораздо легче запомнить).
источник
'HTTPConnectionFactory'
, ваш код производит'h_tt_pconnection_factory'
, код из принятого ответа производит'http_connection_factory'
Вот мое решение:
Это поддерживает те угловые случаи, обсужденные в комментариях. Например, он будет преобразован
getHTTPResponseCode
вget_http_response_code
как надо.источник
Для удовольствия:
Или, больше для удовольствия:
источник
str.join
осуждается целую вечность . Используйте''.join(..)
вместо этого.Использование регулярных выражений может быть самым коротким, но это решение более читабельно:
источник
Так много сложных методов ... Просто найдите всю группу "Titled" и присоедините ее вариант в нижнем регистре с подчеркиванием.
Если вы не хотите, чтобы цифры были похожи на первый символ группы или отдельной группы - вы можете использовать
([A-z][a-z0-9]*)
маску.источник
Не в стандартной библиотеке, но я обнаружил, что этот скрипт содержит необходимые вам функции.
источник
Это не элегантный метод, это реализация очень низкого уровня простого конечного автомата (конечного автомата с битовым полем), возможно, наиболее анти-питонический режим для решения этой проблемы, однако модуль re также реализует слишком сложный конечный автомат для решения этого простого задача, так что я думаю, что это хорошее решение.
splitsymbol может анализировать все типы дел: UpperSEQUENCEInterleaved, under_score, BIG_SYMBOLS и cammelCasedMethods
Надеюсь это полезно
источник
Легко адаптировано из https://stackoverflow.com/users/267781/matth, которые используют генераторы.
источник
Взгляните на превосходную библиотеку Schematics
https://github.com/schematics/schematics
Это позволяет вам создавать типизированные структуры данных, которые могут сериализовать / десериализовать от Python до Javascript, например:
источник
Этот простой метод должен сделать работу:
(взято отсюда , см. рабочий пример онлайн )
источник
Вау, я только что украл это из фрагментов Джанго. ссылка http://djangosnippets.org/snippets/585/
Довольно элегантно
Пример:
Возвращает:
REGEX DEMO
источник
Ужасный пример с использованием регулярных выражений (это можно легко очистить :)):
Работает для getHTTPResponseCode, хотя!
В качестве альтернативы, используя лямбду:
РЕДАКТИРОВАТЬ: также должно быть довольно легко увидеть, что есть место для улучшений для таких случаев, как «Тест», потому что подчеркивание безоговорочно вставляется.
источник
Вот что я сделал, чтобы изменить заголовки файла с разделителями табуляции. Я опускаю ту часть, где я редактировал только первую строку файла. Вы можете легко адаптировать его к Python с помощью библиотеки re. Это также включает в себя разделение чисел (но сохраняет цифры вместе). Я сделал это в два этапа, потому что это было проще, чем указывать не ставить подчеркивание в начале строки или табуляции.
Шаг первый ... найдите заглавные буквы или целые числа, перед которыми стоят строчные буквы, и поставьте перед ними подчеркивание:
Поиск:
Замена:
Шаг второй ... возьмите приведенное выше и запустите его снова, чтобы преобразовать все заглавные буквы в нижний регистр:
Поиск:
Замена (это обратный слеш, строчные буквы L, обратный слеш, один):
источник
Я искал решение той же проблемы, за исключением того, что мне нужна была цепочка; например
Начав с хороших двухсловных решений, я придумал следующее:
Большая часть сложной логики заключается в том, чтобы не допускать ввод первого слова в нижнем регистре. Вот более простая версия, если вы не против изменить первое слово:
Конечно, вы можете предварительно скомпилировать регулярные выражения или объединить с подчеркиванием вместо дефиса, как обсуждалось в других решениях.
источник
Кратко без регулярных выражений, но HTTPResponseCode => httpresponse_code:
источник
Без какой-либо библиотеки:
Немного тяжелый, но
источник
Очень хороший RegEx предложил на этом сайте :
Если у python есть метод String Split, он должен работать ...
В Java:
источник
И если нам нужно покрыть случай уже не верблюдным вводом:
источник
На случай, если кому-то понадобится преобразовать полный исходный файл, вот скрипт, который это сделает.
источник
Мне очень повезло с этим:
Это может быть , очевидно , оптимизировано для скорости на крошечные немного , если вы хотите.
источник
источник
Использование:
str.capitalize()
для преобразования первой буквы строки (содержащейся в переменной str) в заглавную букву и возвращает всю строку.Пример: Команда: "привет" .capitalize () Вывод: Привет
источник