(Python)不使用.title()或.capitalize()来大写每个单词的首字母

时间:2017-10-02 03:01:21

标签: string python-3.x input

我试图找到一种方法来将给定短语中每个单词的第一个字母大写,不包括几个单词(例如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

编辑:我搜索了多个帖子,其中没有一个能够回答我的具体问题。

2 个答案:

答案 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