Титрование строки с исключениями
есть ли стандартный способ в Python для титрования строки (т. е. слова начинаются с прописных символов, все остальные символы в регистре имеют нижний регистр), но оставляя такие статьи, как and
,in
и of
в нижнем регистре?
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
соединяет элементы списка с разделителем (пробел)