Пример:
HILO -> Hilo
new york -> New York
SAN FRANCISCO -> San Francisco
Есть библиотека или стандартный способ выполнить эту задачу?
Пример:
HILO -> Hilo
new york -> New York
SAN FRANCISCO -> San Francisco
Есть библиотека или стандартный способ выполнить эту задачу?
Ответы:
Почему бы не использовать titleRight from the docs:
>>> "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
У меня нет решения для этих случаев (или других, которые можно было бы представить с некоторым творчеством). Итак, как и во всем, что связано со строками, примите во внимание свои собственные крайние случаи и удачи с юникодом!
Возможная библиотека: 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