分割一个字符串,逐个字符地循环遍历,并替换特定的字符串?

时间:2018-12-13 19:42:48

标签: python python-3.x

我正在从事一项任务,并且陷入了一项特定的任务。我需要编写两个执行相似功能的函数。首先需要纠正句子开头的大写字母,并在完成时计数。我尝试了以下代码:

def fix_capitalization(usrStr):
count = 0
fixStr = usrStr.split('.')
for sentence in fixStr:
    if sentence[0].islower():
        sentence[0].upper()
        count += 1
print('Number of letters capitalized: %d' % count)
print('Edited text: %s' % fixStr)

Bu接收到超出范围的错误。我收到“索引超出范围错误”并且不确定原因。 sentence[0]不应该简单地引用列表中特定字符串中的第一个字符吗?

我还需要用其他字符替换某些字符,如下所示:

def  replace_punctuation(usrStr):
    s = list(usrStr)
    exclamationCount = 0
    semicolonCount = 0
    for sentence in s:
        for i in sentence:
            if i == '!':
                sentence[i] = '.'
                exclamationCount += 1
            if i == ';':
                sentence[i] = ','
                semicolonCount += 1
    newStr = ''.join(s)
    print(newStr)
    print(semicolonCount)
    print(exclamationCount)

但是我正在努力弄清楚一旦找到角色,如何实际进行替换。我在哪里错了?

在此先感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

我会在一个字符上使用str.capitalize而不是str.upper。它也可以在空字符串上正常工作。另一个主要改进是,在遍历列表时,还使用enumerate来跟踪索引:

def fix_capitalization(s):
    sentences = [sentence.strip() for sentence in s.split('.')]
    count = 0
    for index, sentence in enumerate(sentences):
        capitalized = sentence.capitalize()
        if capitalized != sentence:
            count += 1
            sentences[index] = capitalized
    result = '. '.join(sentences)
    return result, count

您可以采用类似的方法来替换标点符号:

replacements = {'!': '.', ';': ','}

def replace_punctuation(s):
    l = list(s)
    counts = dict.fromkeys(replacements, 0)
    for index, item in enumerate(l):
        if item in replacements:
            l[index] = replacements[item]
            counts[item] += 1
    print("Replacement counts:")
    for k, v in counts.items():
        print("{} {:>5}".format(k, v))
    return ''.join(l)

答案 1 :(得分:0)

有更好的方法来执行这些操作,但是我将尽力更改您的代码,以使您学到一些东西。 第一个功能的问题是,当您拆分句子“ Hello”时。在fixStr列表中将有两个句子,最后一个是一个空字符串;因此,空字符串的第一个索引超出范围。通过执行此操作对其进行修复。

def fix_capitalization(usrStr):
    count = 0
    fixStr = usrStr.split('.')
    for sentence in fixStr:
        # changed line
        if sentence != "":
            sentence[0].upper()
            count += 1
    print('Number of letters capitalized: %d' % count)
    print('Edited text: %s' % fixStr)

在您要编写的第二个片段中,将字符串传递给list()时,您会获得该字符串的字符列表。因此,您需要做的就是遍历列表中的元素并替换它们,然后从列表中获取字符串。

def  replace_punctuation(usrStr):
    newStr = ""
    s = list(usrStr)
    exclamationCount = 0
    semicolonCount = 0
    for c in s:
        if c == '!':
            c = '.'
            exclamationCount += 1
        if c == ';':
            c = ','
            semicolonCount += 1
        newStr = newStr + c
    print(newStr)
    print(semicolonCount)
    print(exclamationCount)

希望我能帮上忙!

答案 2 :(得分:0)

Python为此提供了一个不错的内置函数

for str in list:
    new_str = str.replace('!', '.').replace(';', ',')

您可以编写一个单行纸以获取新列表

new_list = [str.replace('!', '.').replace(';', ',') for str in list]

您还可以使用split / join方法

new_str = '.'.join(str.split('!'))
new_str = ','.join(str.split(';'))

要计算大写字母,您可以

result = len([cap for cap in str if str(cap).isupper()])

要大写单词,只需使用

str.capitalize()

希望这对您有用