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


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

8 73

8 ответов:

есть несколько проблем с этим. Если вы используете split и join, некоторые пробелы будут проигнорированы. Встроенные методы capitalize и 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

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

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

существуют следующие методы:

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

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

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

некоторые из умности этих сценариев:

  • Они пишут прописными буквами такие слова, как если, in, of, on и т. д., но не будет капитализировать их, если они ошибочно прописаны во входных данных.

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

  • они пропускают любые слова с точками линии; "example.com-и ...del.icio.us" останется в нижнем регистре.

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

  • первое и последнее слово заголовка всегда заглавными буквами, поэтому ввод типа "нечего бояться" будет превращен в "нечего бояться".

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

можно скачать здесь.

capitalize (word)

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

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

Ok как сказано в ответе выше, вы должны сделать обычай заглавными буквами:

mytext = u'I am a 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

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

value.title()

вернется плотник'S помощник, когда значение плотник's помощник

лучшим решением, вероятно, является решение от @BioGeek с использованием titlecase от Stuart Colville. Это то же самое решение, предложенное @Etienne.

 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
"""

заголовок начинается с заглавной буквы, и это не соответствует статье.

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

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