在Python中将每个句子的首字母大写

3
这是我的代码:
def fix_capitalization(usrStr):
    newString = ''
    wordList = []
    numLetters = 0
    for s in usrStr.split('. '):
        if s[0].isupper():
            s = s.capitalize()
            s = s.replace(' i ', " I ") 
            wordList.append(s)
        if s.islower():
            s = s.capitalize()
            s = s.replace(' i ', " I ") 
            wordList.append(s)
            numLetters += 1

        if s[0].islower():
            s = s.capitalize()
            s = s.replace(' i ', " I ") 
            wordList.append(s)
            numLetters += 1 



    newString = '. '.join(wordList)
    return newString, numLetters

传入的字符串是: i want some water. he has some. maybe he can give me some. i think I will ask. 请注意,maybe 前面有4个空格。我想要的结果是: I want some water. He has some. Maybe he can give me some. I think I will ask. 但我得到的是: I want some water. He has some. maybe he can give me some. I think I will ask. 我知道 maybe 没有被大写,因为我在 . 上进行了拆分,而该句子在句号后有多个空格,但我不确定如何解决这个问题或是否有更好的方法来处理我正在做的事情。任何帮助将不胜感激。

1
你想保留 'maybe' 前面的 4 个空格还是改成标准的 1 个空格? - Skycc
@Skycc 我确实想保留这4个空格。在别人的帮助下,我刚刚编辑了我的问题,使其更加清晰明了。 - Kblo55
http://stackoverflow.com/questions/26320697/capitalization-of-each-sentence-in-a-string-in-python-3 - Kowshik Sundararajan
去掉“.”。然后取每个单词的最后一个字母,转换为大写。然后连接起来。 - joel goldstick
3个回答

0
在for循环中: 首先找到非空字符的索引。 然后用s[index]替换s[0]。

我尝试过这样做,但无法使其正常工作。如果您不介意的话,能否解释一下我应该如何做呢? - Kblo55
1
https://dev59.com/6HE95IYBdhLWcg3wSb3P - Musa K.
那有助于我找到索引,但我不明白的部分是如何用大写版本替换该索引。 - Kblo55
1
我认为这会对你有所帮助。https://dev59.com/vWUo5IYBdhLWcg3wrg9D - Musa K.
maybe 前面总是有 4 个空格吗?如果是的话,那么当你将它们拆分成列表时,只需将其索引为 string[4],这将给你单词 maybe - Imtiaz Raqib

0
使用正则表达式的 sub 方法解决方案。
def fix_capitalization(mystr):
    numLettets = 0
    newstr = []
    for s in mystr.split('. '):
        tmp = re.sub('^(\s*\w+)', lambda x:x.group(1).title(), s)
        newstr.append(tmp)
        # num of letters
        if s.lstrip()[0] != tmp.lstrip()[0]:
            numLetters += 1          
    return '. '.join(newstr).replace(' i ', ' I '), numLetters

fix_capitalization( 'i want some water. he has some.    maybe he can give me some. i think I will ask.')
# return ('I want some water. He has some.    Maybe he can give me some. I think I will ask.', 4)

以下是对原始代码的简单修复

def fix_capitalization(usrStr):
    newString = ''
    wordList = []
    numLetters = 0
    for s in usrStr.split('. '):
        # check for leading space
        lspace = len(s) - len(s.lstrip())
        s = s.lstrip()

        if s[0].isupper():
            s = s.capitalize()
            s = s.replace(' i ', " I ") 
            wordList.append(' '*lspace + s)
        if s.islower():
            s = s.capitalize()
            s = s.replace(' i ', " I ") 
            wordList.append(' '*lspace + s)
            numLetters += 1
        if s[0].islower():
            s = s.capitalize()
            s = s.replace(' i ', " I ") 
            wordList.append(' '*lspace + s)
            numLetters += 1 

    newString = '. '.join(wordList)
    return newString, numLetters

1
如果你希望这个回答具有教育意义而不仅仅是一个有效的回答,你想要解释一下这行代码tmp = re.sub('^(\s*\w+)', lambda x:x.group(1).title(), s)的含义。 - undefined

0
解决方案是在句号后面大写每个字母,忽略中间的空格。
def fix_capitalization(astring):
    newchars = []
    # Treat first char as if follows a "."
    prevnonspacechar = "."
    for char in astring:
        newchar = char
        if prevnonspacechar == ".":
            newchar = char.upper()
        newchars.append(newchar)
        if not char.isspace():
            prevnonspacechar = char
    newstring = "".join(newchars)
    return newstring

astring = """i want some water. he has some.    maybe he can give me some. i think I will ask."""

print(fix_capitalization(astring))

输出:

I want some water. He has some.    Maybe he can give me some. I think I will ask.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接