Приклад:
HILO -> Hilo
new york -> New York
SAN FRANCISCO -> San Francisco
Чи існує бібліотека або стандартний спосіб виконання цього завдання?
Приклад:
HILO -> Hilo
new york -> New York
SAN FRANCISCO -> San Francisco
Чи існує бібліотека або стандартний спосіб виконання цього завдання?
Відповіді:
Чому б не використовувати title прямо з документів:
>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"
Якщо ви дійсно хотіли PascalCase, ви можете використовувати це:
>>> ''.join(x for x in 'make IT pascal CaSe'.title() if not x.isspace())
'MakeItPascalCase'
title: "Алгоритм використовує просте незалежне від мови визначення слова як групи послідовних букв. Визначення працює у багатьох контекстах, але це означає, що апострофи в скороченнях і присвійних знаках утворюють межі слів, що може бути не бажаним результатом ". Одним із можливих рішень було б використовувати відповідь Лоуренса з регулярним виразом, r"['\w]+"щоб апострофи не закінчували збіг (за потреби можна додати додаткові знаки пунктуації).
'make IT camel CaSe'.title().replace(' ', '').
def toCamel(s): ret = ''.join(x for x in s.title() if not x.isspace()) return ret[0].lower() + ret[1:] Використання:toCamel("WRITE this in camelcase") 'writeThisInCamelcase'
def capitalizeWords(s):
return re.sub(r'\w+', lambda m:m.group(0).capitalize(), s)
re.subможе взяти функцію для "заміни" (а не просто рядок, який, як видається, знайомий більшості людей). Ця функція repl буде викликана з re.Matchоб'єктом для кожного збігу шаблону, а результат (який повинен бути рядком) буде використаний як заміна цього збігу.
Довша версія того самого:
WORD_RE = re.compile(r'\w+')
def capitalizeMatch(m):
return m.group(0).capitalize()
def capitalizeWords(s):
return WORD_RE.sub(capitalizeMatch, s)
Це попередньо компілює шаблон (зазвичай вважається хорошою формою) і використовує іменовану функцію замість лямбда.
matchбуде передана функції? а оскільки matchesв регулярних виразах є групи. ось чому ця лінія існує lambda m:m.group(0).capitalize()?
re.subйому дається виклик (наприклад: функція) як "заміна", він передає об'єкт збігу з цим викликом і розраховує повернути рядок, який він фактично використовує в якості заміни. Якщо вам здається, що лямбди заплутані, «довша версія» робить точно те саме, більш детально.
Чому б не написати одного? Щось подібне може задовольнити ваші вимоги:
def FixCase(st):
return ' '.join(''.join([w[0].upper(), w[1:].lower()]) for w in st.split())
Примітка: Чому я даю ще одну відповідь? Ця відповідь базується на назві питання та уявленні, що верблюд визначається як: серія слів, які були об'єднані (без пробілів!), Так що кожне з оригінальних слів починається з великої літери (решта - з малої літери) за винятком першого слова серії (яке є повністю малою). Також передбачається, що "всі рядки" відноситься до набору символів ASCII; unicode не працює з цим рішенням).
Враховуючи наведене вище визначення, ця функція
import re
word_regex_pattern = re.compile("[^A-Za-z]+")
def camel(chars):
words = word_regex_pattern.split(chars)
return "".join(w.lower() if i is 0 else w.title() for i, w in enumerate(words))
, якщо його викликати, це призведе до цього
camel("San Francisco") # sanFrancisco
camel("SAN-FRANCISCO") # sanFrancisco
camel("san_francisco") # sanFrancisco
Зверніть увагу, що це не вдається, якщо його подарувати вже в’язаній верблюдом струні!
camel("sanFrancisco") # sanfrancisco <-- noted limitation
Зверніть увагу, що це не вдається з багатьма рядками Unicode
camel("México City") # mXicoCity <-- can't handle unicode
У мене немає рішення для цих випадків (або інших, які можна було б представити з певною творчістю). Отже, як і у всіх речах, пов’язаних із струнами, покрийте власні випадки краю та удачі Unicode!
Потенційна бібліотека: https://pypi.org/project/stringcase/
Приклад:
import stringcase
stringcase.camelcase('foo_bar_baz') # => "fooBarBaz"
Хоча сумнівно, чи залишатиме пробіли. (Приклади показують, що він вилучає простір, але є проблема з відстежувачем помилок, зазначаючи, що він залишає їх там.)
просто використовуйте .title (), і він перетворить першу літеру кожного слова з великої літери, а решту в малому:
>>> a='mohs shahid ss'
>>> a.title()
'Mohs Shahid Ss'
>>> a='TRUE'
>>> b=a.title()
>>> b
'True'
>>> eval(b)
True
def camelCase(st):
s = st.title()
d = "".join(s.split())
d = d.replace(d[0],d[0].lower())
return d