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