2014-10-12 3 views
1

Это должно быть легко, но как-то я не совсем понимаю.Капитализация каждого предложения в строке в Python 3

Мое назначение:

Write a function sentenceCapitalizer that has one parameter of type string. The function returns a copy of the string with the first character of each sentence capitalized. The function should return “Hello. My name is Joe. What is your name?” if the argument to the function is “hello. my name is Joe. what is your name?” Assume a sentence is separated by a period followed by a space."

То, что я до сих пор:

def sentenceCapitalizer (string1: str): 
    words = string1.split(". ") 
    words2=words.capitalize() 
    string2=words2.join() 
    return (string2) 

print (sentenceCapitalizer("hello. my name is Joe. what is your name?")) 

После выполнения я получаю ошибку:

Traceback (most recent call last): 
    File "C:\Users\Andrew\Desktop\lab3.py", line 83, in <module> 
    print (sentenceCapitalizer("hello. my name is Joe. what is your name?")) 
    File "C:\Users\Andrew\Desktop\lab3.py", line 79, in sentenceCapitalizer 
    words2=words.capitalize() 
AttributeError: 'list' object has no attribute 'capitalize'" 

Что это говорит мне, и как я исправить это? Я попробовал следующие инструкции, найденные на странице, перечисленной в качестве основы программного обеспечения python, поэтому я думал, что у меня это получится.

+2

Примечание: Python 3.5 еще не был выпущен (это все еще в стадии разработки), поэтому ваше требование, чтобы использовать 3.5.5 это .. удивительно; вы, вероятно, имеете * другую * версию Python, вместо того, чтобы использовать машину времени. –

ответ

2

Вы пытаетесь использовать строковый метод для неправильного объекта; words Список Объект содержащий строки. Используйте метод на каждом отдельном элементе вместо:

words2 = [word.capitalize() for word in words] 

Но это было бы применение неправильно преобразование; вы не хотите использовать все предложение, но просто первое письмо. str.capitalize() бы нижний регистр все остальное, в том числе J в Joe:

>>> 'my name is Joe'.capitalize() 
'My name is joe'  

Ограничьте себя в первой буквы только, а затем добавить обратно остальную часть строки без изменений:

words2 = [word[0].capitalize() + word[1:] for word in words] 

Далее , объект списка не имеет метода .join(); что тоже является метод строки:

string2 = '. '.join(words2) 

Это присоединятся строки в words2 с '. ' (полной остановкой и пространством) столяр.

Здесь вы, вероятно, захотите использовать лучшие имена переменных; ваши строки - это предложения, а не слова, поэтому ваш код мог бы лучше отразить это.

вместе, что делает вашу функцию:

def sentenceCapitalizer (string1: str): 
    sentences = string1.split(". ") 
    sentences2 = [sentence[0].capitalize() + sentence[1:] for sentence in sentences] 
    string2 = '. '.join(sentences2) 
    return string2 

Демо:

>>> def sentenceCapitalizer (string1: str): 
...  sentences = string1.split(". ") 
...  sentences2 = [sentence[0].capitalize() + sentence[1:] for sentence in sentences] 
...  string2 = '. '.join(sentences2) 
...  return string2 
... 
>>> print (sentenceCapitalizer("hello. my name is Joe. what is your name?")) 
Hello. My name is Joe. What is your name? 
+0

Он спрашивает о том, чтобы использовать первый символ каждого предложения, а не каждое слово. Изменить: Отлично, вы обновили это до вопроса. – danijar

+0

@ danijar: Не путайте имена переменных, разделение на '. «'. –

+0

Но '.capitalize()' сдует заглавные слова, поэтому 'Joe' станет' joe', а '' '.join' уничтожит исходные периоды. – DSM

0

Это делает работу. Поскольку он извлекает все предложения, включая их конечные пробелы, это также работает, если у вас есть несколько абзацев, где есть разрывы строк между предложениями.

import re 

def sentence_case(text): 
    # Split into sentences. Therefore, find all text that ends 
    # with punctuation followed by white space or end of string. 
    sentences = re.findall('[^.!?]+[.!?](?:\s|\Z)', text) 

    # Capitalize the first letter of each sentence 
    sentences = [x[0].upper() + x[1:] for x in sentences] 

    # Combine sentences 
    return ''.join(sentences) 

Адрес working example.

0

Чтобы разрешить произвольные пробелы после точки.Или капитализировать полные слова (Это может сделать разницу для текста Unicode), вы могли бы use regular expressions -- re module:

#!/usr/bin/env python3 
import re 

def sentenceCapitalizer(text): 
    return re.sub(r"(\.\s+|^)(\w+)", 
        lambda m: m.group(1) + m.group(2).capitalize(), 
        text) 

s = "hEllo. my name is Joe. what is your name?" 
print(sentenceCapitalizer(s)) 
# -> 'Hello. My name is Joe. What is your name?' 

Примечание: pep8 рекомендует имена в нижнем регистре для функций, например, capitalize_sentence() вместо sentenceCapitalizer().

Чтобы принять большее изменение величины текстов, вы могли бы use nltk package:

# $ pip install nltk 
from nltk.tokenize import sent_tokenize, word_tokenize 

def sent_capitalize(sentence): 
    """Capitalize the first word in the *sentence*.""" 
    words = word_tokenize(sentence) 
    if words: 
     words[0] = words[0].capitalize() 
    return " ".join(words[:-1]) + "".join(words[-1:]) # dot 

text = "hEllo. my name is Joe. what is your name?" 
# split the text into a list of sentences 
sentences = sent_tokenize(text) 
print(" ".join(map(sent_capitalize, sentences))) 
# -> Hello. My name is Joe. What is your name? 
0

Я не использовал «раскол», но только в то время как петли вместо этого. Вот мой код.

my_string = input('Enter a string: ') 
new_string = '' 
new_string += my_string[0].upper() 
i = 1 

while i < len(my_string)-2: 
    new_string += my_string[i] 
    if my_string[i] == '.' or my_string[i] == '?' or my_string[i] == '!': 
     new_string += ' ' 
     new_string += my_string[i+2].upper() 
     i = i+3 
    else: 
     if i == len(my_string)-3: 
      new_string += my_string[len(my_string)-2:len(my_string)] 
     i = i+1 

print(new_string) 

Вот как это работает:

Enter a string: hello. my name is Joe. what is your name? 
Hello. My name is Joe. What is your name 
0

Просто потому, что я не мог найти это решение здесь.

Вы можете использовать метод 'sent_tokenize' из nltk.

import nltk 
string = "hello. my name is Joe. what is your name?" 
sentences = nltk.sent_tokenize(string) 
print (' '.join([s.replace(s[0],s[0].capitalize(),1) for s in sentences])) 

И выход

Hello. My name is Joe. What is your name?