Заголовок в виде строки с исключениями - PullRequest
85 голосов
/ 16 сентября 2010

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

Ответы [ 8 ]

144 голосов
/ 16 сентября 2010

Есть несколько проблем с этим.Если вы используете split и join, некоторые пробельные символы будут игнорироваться.Встроенные методы прописной буквы и заголовка не игнорируют пробелы.

>>> '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
47 голосов
/ 16 сентября 2010

Используйте модуль titlecase.py !Работает только для английского языка.

>>> from titlecase import titlecase
>>> titlecase('i am a foobar bazbar')
'I Am a Foobar Bazbar'

GitHub: https://github.com/ppannuto/python-titlecase

20 голосов
/ 16 сентября 2010

Есть такие методы:

>>> mytext = u'i am a foobar bazbar'
>>> print mytext.capitalize()
I am a foobar bazbar
>>> print mytext.title()
I Am A Foobar Bazbar

Нет строчной опции. Вы должны написать это самостоятельно, вероятно, используя список статей, которые вы хотите опустить.

12 голосов
/ 10 февраля 2012

Стюарт Колвилл сделал порт Python из сценарием Perl, написанным Джоном Грубером для преобразования строк в регистр заголовков, но избегает использования заглавных букв на основе правил из руководства New York Times стиля, а также питание для нескольких особых случаев.

Некоторые хитрости этих сценариев:

  • они пишутся заглавными буквами, такими как , если, in, of, на и т. Д., Но не пишут их заглавными буквами, если они ошибочно вводятся с заглавной буквы на входе.

  • сценарии предполагают, что слова с заглавными буквами, отличными от первого символа, уже правильно написаны заглавными буквами. Это означает, что они оставят слово «iTunes» в покое, вместо того, чтобы перебивать его в «ITunes» или, что еще хуже, «Itunes».

  • они пропускают любые слова с точками строки; «Example.com» и «del.icio.us» останутся строчными.

  • у них есть жестко закодированные хаки, специально предназначенные для работы с нечетными случаями, такими как «AT & T» и «Q & A», оба из которых содержат маленькие слова (at и a), которые обычно должны быть строчными.

  • Первое и последнее слово заголовка всегда пишется с заглавной буквы, поэтому ввод, такой как «Ничего не бояться», будет превращен в «Ничего не бояться».

  • Маленькое слово после двоеточия будет написано заглавными буквами.

Вы можете скачать его здесь .

4 голосов
/ 16 сентября 2010
capitalize (word)

Это должно сделать. Я понимаю это по-другому.

>>> mytext = u'i am a foobar bazbar'
>>> mytext.capitalize()
u'I am a foobar bazbar'
>>>

Хорошо, как сказано в ответе выше, вы должны сделать прописную букву:

mytext = u'i, я 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
2 голосов
/ 30 ноября 2014

В методе заголовка Python 2.7 есть недостаток.

value.title()

вернет Carpenter ' S Помощник, когда значение равно Carpenter' s Assistant

Лучшим решением, вероятно, является решение от @BioGeek, использующее заглавие от Стюарта Колвилла. Какое же решение предложено @ Etienne.

1 голос
/ 07 июля 2017

Однострочник с использованием списка и троичного оператора

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() для заголовка строки, если это не статья

" ".join объединяет элементы списка с разделителем (пробел)

1 голос
/ 16 сентября 2010
 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
"""

Название начинается с заглавного слова и не соответствует статье.

...