Titlecasing строка с исключениями

Есть ли стандартный способ в Python, чтобы заголовок строки (т.е. слова начинаются с символов верхнего регистра, все оставшиеся обведенные символы имеют строчные буквы), но оставляя такие статьи, как and, in и of с нижним регистром?

Ответ 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

Ответ 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 объединяет элементы списка с разделителем (пробел)