Przykład:
>>> convert('CamelCase')
'camel_case'
python
camelcasing
Sridhar Ratnakumar
źródło
źródło
NotCamelCase
alethisIs
Odpowiedzi:
Etui na wielbłąda na etui z wężem
Jeśli robisz to wiele razy, a powyższe jest wolne, skompiluj wcześniej wyrażenie regularne:
Specjalnie do obsługi bardziej zaawansowanych przypadków (nie jest to już odwracalne):
Etui z węża na etui z wielbłądem
źródło
not_camel_case
nanotCamelCase
i / lubNotCamelCase
?s2.replace('__', '_')
W indeksie pakietów znajduje się biblioteka fleksji, która może obsłużyć te rzeczy za Ciebie. W takim przypadku będziesz szukał
inflection.underscore()
:źródło
Nie wiem, dlaczego to wszystko jest takie skomplikowane.
w większości przypadków proste wyrażenie
([A-Z]+)
wystarczyAby zignorować pierwszą postać, wystarczy spojrzeć za siebie
(?!^)
Jeśli chcesz oddzielić ALLCaps od all_caps i oczekujesz liczb w swoim ciągu, nadal nie musisz wykonywać dwóch osobnych przebiegów, po prostu użyj
|
tego wyrażenia,((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))
które poradzi sobie z każdym scenariuszem w książceWszystko zależy od tego, czego chcesz, więc skorzystaj z rozwiązania, które najlepiej odpowiada Twoim potrzebom, ponieważ nie powinno być zbyt skomplikowane.
nJoy!
źródło
(?!^)
że nazywa się to „spojrzenie za siebie”. Chyba, że czegoś mi brakuje, tak naprawdę chcemy tutaj negatywnego spojrzenia, które należy wyrazić jako(?<!^)
. Z powodów, dla których nie rozumiem, wasze negatywne spojrzenie w przyszłość również(?!^)
wydaje się działać ..."Camel2WARNING_Case_CASE"
staje się"camel2_warning_case__case"
. Możesz dodać(?<!_)
negatywny wygląd, aby go rozwiązać:re.sub('((?<=[a-z0-9])[A-Z]|(?!^)(?<!_)[A-Z](?=[a-z]))', r'_\1', "Camel2WARNING_Case_CASE").lower()
zwraca'camel2_warning_case_case'
(?!^)
został niepoprawnie nazwany „patrz za siebie” i zamiast tego powinien zostać nazwany negatywnym stwierdzeniem z wyprzedzeniem . Jak pokazuje to miłe wyjaśnienie , negatywne spojrzenia zwykle pojawiają się po szukanym wyrażeniu. Więc można myśleć(?!^)
jako „znajdź''
gdzie<start of string>
nie wynika”. Rzeczywiście, negatywny lookbehind również działa: można myśleć(?<!^)
jako „znaleźć''
gdzie<start of string>
nie wyprzedza”.stringcase jest moją biblioteką do tego celu; na przykład:
źródło
Osobiście nie jestem pewien, jak cokolwiek używającego wyrażeń regularnych w pythonie można określić jako eleganckie. Większość odpowiedzi tutaj polega na wykonywaniu sztuczek RE typu „golf golfowy”. Eleganckie kodowanie powinno być łatwe do zrozumienia.
źródło
+=
na sznurkach jest prawie zawsze złym pomysłem. Dołącz do listy i''.join()
na końcu. Lub w tym przypadku po prostu dołącz do niego podkreślenie ...Wolę unikać,
re
jeśli to możliwe:źródło
re
biblioteki i robienia rzeczy tylko w jednym wierszu przy użyciu wbudowanych metod str.methods! Jest podobny do tej odpowiedzi , ale unika używania krojenia i dodatkowegoif ... else
, po prostu usuwając potencjalnie dodane „_” jako pierwszy znak. Najbardziej to lubię.6.81 µs ± 22.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
ale za tę odpowiedź,2.51 µs ± 25.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
która jest 2,5 razy szybsza! Kocham to!źródło
Myślę, że to rozwiązanie jest prostsze niż poprzednie odpowiedzi:
Które wyjścia:
Wyrażenie regularne pasuje do trzech wzorców:
[A-Z]?[a-z]+
: Kolejne małe litery, które opcjonalnie zaczynają się od dużej litery.[A-Z]{2,}(?=[A-Z][a-z]|\d|\W|$)
: Dwie lub więcej kolejnych wielkich liter. Wykorzystuje lookahead, aby wykluczyć ostatnią wielką literę, jeśli następuje po niej mała litera.\d+
: Kolejne numery.Korzystając z niego
re.findall
, otrzymujemy listę pojedynczych „słów”, które można przekonwertować na małe litery i połączyć z podkreślnikami.źródło
Nie mam pojęcia, dlaczego używam obu wywołań .sub ()? :) Nie jestem guru wyrażeń regularnych, ale uprościłem funkcję do tej, która jest odpowiednia dla moich niektórych potrzeb, po prostu potrzebowałem rozwiązania do konwersji camelCasedVars z żądania POST na vars_with_underscore:
Nie działa z takimi nazwami jak getHTTPResponse, ponieważ słyszałem, że jest to zła konwencja nazewnictwa (powinna być jak getHTTPResponse, to oczywiście, że o wiele łatwiej jest zapamiętać ten formularz).
źródło
'HTTPConnectionFactory'
, tworzy kod'h_tt_pconnection_factory'
, kod z zaakceptowanej odpowiedzi tworzy'http_connection_factory'
Oto moje rozwiązanie:
Obsługuje te przypadki narożne omówione w komentarzach. Na przykład, będzie ona przekształcić
getHTTPResponseCode
sięget_http_response_code
tak jak powinien.źródło
Dla zabawy:
Lub więcej dla zabawy:
źródło
str.join
był przestarzały od wieków . Użyj''.join(..)
zamiast tego.Używanie wyrażeń regularnych może być najkrótsze, ale to rozwiązanie jest o wiele bardziej czytelne:
źródło
Tak wiele skomplikowanych metod ... Po prostu znajdź całą grupę „Tytułowa” i dołącz do jej małej wersji z podkreśleniem.
Jeśli nie chcesz tworzyć liczb takich jak pierwszy znak grupy lub oddzielnej grupy - możesz użyć
([A-z][a-z0-9]*)
maski.źródło
Nie w standardowej bibliotece, ale znalazłem ten skrypt, który wydaje się zawierać potrzebną funkcjonalność.
źródło
To nie jest elegancka metoda, jest to implementacja bardzo niskiego poziomu prostej maszyny stanów (maszyna stanu bitfielda), być może najbardziej anty-pythonowy tryb do rozwiązania tego problemu, jednak moduł ponownie implementuje zbyt złożoną maszynę stanu do rozwiązania tej prostej zadanie, więc myślę, że to dobre rozwiązanie.
symbol podziału może analizować wszystkie typy przypadków: UpperSEQUENCEInterleaved, under_score, BIG_SYMBOLS i cammelCasedMethods
Mam nadzieję, że się przyda
źródło
Lekko dostosowany z https://stackoverflow.com/users/267781/matth, którzy korzystają z generatorów.
źródło
Spójrz na doskonałą bibliotekę Schematics
https://github.com/schematics/schematics
Pozwala tworzyć struktury danych typowanych, które mogą serializować / deserializować z języka Python do Javascript, np .:
źródło
Ta prosta metoda powinna wykonać zadanie:
(wzięte stąd , patrz działający przykład online )
źródło
Wow, właśnie ukradłem to z fragmentów django. ref http://djangosnippets.org/snippets/585/
Całkiem elegancki
Przykład:
Zwroty:
REGEX DEMO
źródło
Przerażający przykład z użyciem wyrażeń regularnych (można to łatwo wyczyścić :)):
Działa jednak dla getHTTPResponseCode!
Alternatywnie, używając lambda:
EDYCJA: Powinno być również dość łatwo zauważyć, że jest miejsce na ulepszenia dla przypadków takich jak „Test”, ponieważ podkreślenie jest bezwarunkowo wstawione.
źródło
Oto coś, co zrobiłem, aby zmienić nagłówki w pliku rozdzielanym tabulatorami. Pomijam część, w której edytowałem tylko pierwszą linię pliku. Możesz łatwo dostosować go do Pythona za pomocą biblioteki re. Obejmuje to także oddzielanie liczb (ale utrzymuje cyfry razem). Zrobiłem to w dwóch krokach, ponieważ było to łatwiejsze niż mówienie, aby nie umieszczać podkreślenia na początku linii lub tabulacji.
Krok pierwszy ... znajdź wielkie litery lub liczby całkowite poprzedzone małymi literami i poprzedź je znakiem podkreślenia:
Szukaj:
Zastąpienie:
Krok drugi ... weź powyższe i uruchom ponownie, aby przekonwertować wszystkie wielkie litery na małe:
Szukaj:
Zastąpienie (to odwrotny ukośnik, mała litera L, odwrotny ukośnik, jeden):
źródło
Szukałem rozwiązania tego samego problemu, tyle że potrzebowałem łańcucha; na przykład
Zaczynając od fajnych rozwiązań dwóch słów tutaj, wymyśliłem:
Większość skomplikowanej logiki polega na unikaniu zmniejszania pierwszego słowa. Oto prostsza wersja, jeśli nie masz nic przeciwko zmianie pierwszego słowa:
Oczywiście można wstępnie kompilować wyrażenia regularne lub łączyć z podkreśleniem zamiast łącznika, jak omówiono w innych rozwiązaniach.
źródło
Zwięzłe bez wyrażeń regularnych, ale HTTPResponseCode => httpresponse_code:
źródło
Bez biblioteki:
Trochę ciężko, ale
źródło
Bardzo ładne RegEx zaproponowane na tej stronie :
Jeśli python ma metodę podziału ciągu, powinien działać ...
W Javie:
źródło
A jeśli musimy pokryć skrzynkę z już nie rozpiętym wejściem:
źródło
Na wypadek, gdyby ktoś musiał przekształcić pełny plik źródłowy, oto skrypt, który to zrobi.
źródło
Miałem dość szczęścia z tym:
Może to oczywiście być zoptymalizowane pod kątem szybkości jest malutki kawałek, jeśli chcesz.
źródło
źródło
Posługiwać się:
str.capitalize()
do konwersji pierwszej litery ciągu (zawartej w zmiennej str) na wielką literę i zwraca cały ciąg.Przykład: Polecenie: „hello” .capitalize () Dane wyjściowe: Hello
źródło