Есть ли стандартный способ в Python, чтобы заголовок строки (т.е. слова начинаются с символов верхнего регистра, все оставшиеся обведенные символы имеют строчные буквы), но оставляя такие статьи, как and, in и of с нижним регистром?
Titlecasing строка с исключениями
Ответ 1
Есть несколько проблем с этим. Если вы используете split и join, некоторые символы пробела будут игнорироваться. Встроенные методы capize и title не игнорируют пробелы.
>>> 'There     is a way'.title()
'There     Is A Way'
Если предложение начинается с статьи, вы не хотите, чтобы первое слово заголовка было в нижнем регистре.
Помня об этом:
import re 
def title_except(s, exceptions):
    word_list = re.split(' ', s)       # re.split behaves as expected
    final = [word_list[0].capitalize()]
    for word in word_list[1:]:
        final.append(word if word in exceptions else word.capitalize())
    return " ".join(final)
articles = ['a', 'an', 'of', 'the', 'is']
print title_except('there is a    way', articles)
# There is a    Way
print title_except('a whim   of an elephant', articles)
# A Whim   of an Elephant
		Ответ 2
Используйте модуль titlecase.py ! Работает только для английского.
>>> from titlecase import titlecase
>>> titlecase('i am a foobar bazbar')
'I Am a Foobar Bazbar'
		Ответ 3
Существуют следующие методы:
>>> mytext = u'i am a foobar bazbar'
>>> print mytext.capitalize()
I am a foobar bazbar
>>> print mytext.title()
I Am A Foobar Bazbar
Нет опции в нижнем регистре. Вы должны сами их закодировать, возможно, используя список статей, которые вы хотите снизить.
Ответ 4
Стюарт Колвилл создал порт на Python для сценария Perl, написанного Джоном Грубером, для преобразования строк в регистр заголовков, но избегает использования заглавных букв на основе правил из руководства по стилю New York Times, а также учитывает некоторые особые случаи.
Некоторые из хитрости этих сценариев:
-  
они пишутся с маленькой буквы, например, если, в, на и т.д., но не пишут их с заглавной буквы, если они ошибочно вводятся с заглавной буквы.
 -  
сценарии предполагают, что слова с заглавными буквами, отличными от первого символа, уже правильно прописаны. Это означает, что они оставят слово "iTunes" в покое, вместо того, чтобы перебивать его в "ITunes" или, что еще хуже, "Itunes".
 -  
они пропускают любые слова с линейными точками; "example.com" и "del.icio.us" останутся строчными.
 -  
у них есть жестко закодированные хаки, специально предназначенные для работы с нечетными случаями, такими как "AT & T" и "Q & A", оба из которых содержат маленькие слова (at и a), которые обычно должны быть строчными.
 -  
Первое и последнее слово заголовка всегда пишется с заглавной буквы, поэтому ввод, такой как "Ничего не бояться", будет превращен в "Ничего не бояться".
 -  
Маленькое слово после двоеточия будет написано заглавными буквами.
 
Вы можете скачать его здесь.
Ответ 5
capitalize (word)
Это должно быть сделано. Я понимаю это иначе.
>>> mytext = u'i am a foobar bazbar'
>>> mytext.capitalize()
u'I am a foobar bazbar'
>>>
Хорошо, как сказано в ответе выше, вы должны сделать пользовательскую заглавные буквы:
mytext = u'i am foobar bazbar '
def xcaptilize(word):
    skipList = ['a', 'an', 'the', 'am']
    if word not in skipList:
        return word.capitalize()
    return word
k = mytext.split(" ") 
l = map(xcaptilize, k)
print " ".join(l)   
Выводит
I am a Foobar Bazbar
		Ответ 6
У метода заголовка Python 2.7 есть недостаток.
value.title()
вернет помощник S специалиста Carpenter , когда значение является "Carpenter" s Помощник
Лучшим решением является, вероятно, одно из @BioGeek с использованием титульного листа от Stuart Colville. Это то же самое решение, предложенное @Etienne.
Ответ 7
 not_these = ['a','the', 'of']
thestring = 'the secret of a disappointed programmer'
print ' '.join(word
               if word in not_these
               else word.title()
               for word in thestring.capitalize().split(' '))
"""Output:
The Secret of a Disappointed Programmer
"""
Заголовок начинается с заглавного слова и не соответствует статье.
Ответ 8
Однострочный с использованием понимания списка и тернарного оператора
reslt = " ".join([word.title() if word not in "the a on in of an" else word for word in "Wow, a python one liner for titles".split(" ")])
print(reslt)
Структура:
 for word in "Wow, a python one liner for titles".split(" ") Разделяет строку в списке и инициирует цикл for (в расчете списка)
 word.title() if word not in "the a on in of an" else word использует собственный метод title() для заголовка case, если это не статья
 " ".join объединяет элементы списка с разделителем (пробел)