我试图找到一种方法来将给定短语中每个单词的第一个字母大写,不包括几个单词(例如and,the,is),并且需要由用户输入。基本上,我想在不使用.title()或.capitalize()的情况下制作.title()程序。从某种意义上重新创建.title()。
示例:
s = #split, join, upper, lower, etc. functions here
s = input('Enter a sentence: ')
>>>Enter a sentence: the world and me
The World and Me
编辑:我搜索了多个帖子,其中没有一个能够回答我的具体问题。
答案 0 :(得分:0)
将字符串拆分为单词的最简单方法是words = s.split(' ')
(尽管正则表达式通常更好)。
然后你可以迭代这些单词并将它们大写,如果它们没有列入白名单,然后将它们重新加入一个字符串:
words = s.split(' ')
whitelist = {'and', 'the', 'is'}
capitalized = ' '.join([word.title() if word not in whitelist else word for word in words])
答案 1 :(得分:0)
将问题分解为最基本的组件。首先,您需要一些方法来大写单词。你在问题中说你不能使用.title()/ .capitalize()等...所以我会假设.upper()也是。
所以你想要一个这样的功能
def capitalize_word(word):
# do something to ensure word starts with a capital letter
# and modify it if it doesn't
return word
你将需要一个能够接受句子,将其分解为单词并将其中的每一个都大写的函数(暂时忽略你的排除词)
def titlecase_sentence(sentence):
# break the sentence on spaces
words = sentence.split()
capitalized_words = []
# iterate through your words and store the capitalized version of each
for word in words:
capitalized_word = capitalize_word(word)
capitalized_words.append(capitalized_word)
# join your capitalized words back into a sentence
capitalized_sentence = " ".join(capitalized_words)
return capitalized_sentence
所以要弄清楚的两件事是:1。capitalize_word
如何运作,以及2.我们如何处理你的排斥词。
如果您使用ord
内置函数,第一个非常简单。 ord
返回ascii字符的序数值(其数值)。 'a'
的序数为97,'z'
的序数为122.大写字母在数值中较早,而'A'
为65,'Z'
为90.所以你可以检查单词的第一个字符是否在65到90之间,如果它不是,那么你知道你有一个小写字母。在小写和大写字母之间转换就像从序数中减去32并通过内置chr
将其更改回ascii字符一样简单。使用这个你最终会得到像
ord_Z = ord('Z')
ord_A = ord('A')
def capitalize_word(word):
first_ord = ord(word[0])
if not (ord_A <= first_ord <= ord_Z):
word = chr(first_ord - 32) + word[1:]
return word
现在我们只需要处理你的特殊单词,除了开始一个句子之外,这些单词不会被大写。
我会将该部分作为练习,但您基本上希望始终运行capitalize_word
函数的第一个单词,并通过它有条件地运行剩余的单词。如果迭代中的当前单词是您的特殊单词之一,那么您只需添加单词而不调用capitalize_word
。