Python - удаление разрывов абзацев во вводе

Итак, я написал программу (пусть и уродливую), которая подсчитывает количество слов и экземпляров каждого уникального слова в заданном вводе.

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

У меня вопрос: как я могу использовать ввод текста с разрывами абзаца и сократить ввод до одной строки?

Это мой код на данный момент:

Song = {}
lines = []


while True:                                        
    line = input("")                                
    if line:
        lines.append(line)
    else:
        break

string = '\n'.join(lines)

def string_cleaner(string):
    string = string.lower()
    newString = ''
    validLetters = " abcdefghijklmnopqrstuvwxyz"
    newString = ''.join([char for char in string if char in validLetters])
    return newString

def song_splitter(string):
    string = string_cleaner(string)
    words = string.split()
    for word in words:
        if word in Song:
            Song[word] += 1
        else:
            Song[word] = 1

Ожидаемый ввод:

Well, my heart went "boom"
When I crossed that room
And I held her hand in mine
Whoah, we danced through the night
And we held each other tight
And before too long I fell in love with her
Now I'll never dance with another
(Whooh)
Since I saw her standing there
Oh since I saw her standing there
Oh since I saw her standing there

Желаемый результат:

This song has 328 words.
39 of which are unique.

This song is 11% unique words.
('i', 6)
('her', 4)
('standing', 3)
.... etc

Зачем вам нужно сокращать ввод до одной строки? Вы можете добавить все строки в список и пройти по нему.

KaiserKatze 25.08.2018 04:38

Я новичок в программировании, поэтому я могу не знать всех сокращений, но моя проблема на данный момент заключается в том, что когда я пытаюсь ввести строку с разрывом абзаца (в IDLE), IDLE считывает разрыв абзаца как конец Вход. например, IDLE мог бы прочитать: «Но когда я вернусь к вам домой, я нахожу, что то, что вы делаете, заставит меня чувствовать себя хорошо // Знаешь, я работаю весь день, чтобы получить деньги, чтобы купить тебе вещи И это того стоит, чтобы просто услышать тебя. скажи, что собираешься дать мне все "как только", но когда ... чтобы ... чувствовать себя хорошо "

applsiid 25.08.2018 05:31

Возможно, вам следует указать в вопросе пример ввода и желаемый результат.

KaiserKatze 25.08.2018 07:22

Пользовательский ввод: Ну, у меня сердце "бум", Когда я пересек эту комнату И я держал ее руку в своей Ого, мы танцевали всю ночь И мы крепко обнимали друг друга И вскоре я влюбился в нее Теперь я никогда не танцевать с другими (Ух) С тех пор, как я увидел ее стоящей О, с тех пор, как я увидел ее стоящей О, с тех пор, как я увидел ее стоящей там Желаемый результат что-то вроде: В этой песне 328 слов. 39 из которых уникальны. Эта песня на 11% состоит из уникальных слов. ('я', 6) ('она', 4) ('стоящая', 3) .... и т. д.

applsiid 25.08.2018 19:28

Напечатанные атрибуты не имеют значения ... Эта песня состоит из длинных слов бла-бла ... Я понимаю, что разрыв строки между «И я держал ее руку в своей» и «Ого, мы танцевали всю ночь» "обрабатывается так, как если бы пользователь" вводил "только строки до разрыва. Я пытаюсь найти способ избавиться от этого.

applsiid 25.08.2018 19:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
79
1

Ответы 1

Следующий пример кода извлекает все слова (Только английский алфавит) из каждой строки и обрабатывает их (подсчитывает количество слов и извлекает экземпляры каждого уникального слова).

import re

MESSAGE = 'Please input a new line: '
TEST_LINE = '''
Well, my heart went "boom"
When I crossed that room
And I held her hand in mine
Whoah, we danced through the night
And we held each other tight
And before too long I fell in love with her
Now I'll never dance with another
(Whooh)
Since I saw her standing there
Oh since I saw her standing there well well
Oh since I saw her standing there
'''

prog = re.compile(r'\w+')

class UniqueWordCounter():

    def __init__(self):
        self.data = {}

    def add(self, word):
        if word:
            count = self.data.get(word)
            if count:
                count += 1
            else:
                count = 1
            self.data[word] = count


# instances of each unique word
set_of_words = UniqueWordCounter()
# counts the number of words
count_of_words = 0

def handle_line(line):
    line = line.lower()
    words = map(lambda mo: mo.group(0), prog.finditer(line))
    for word in words:
        global count_of_words
        count_of_words += 1
        set_of_words.add(word)

def run():
    line = input(MESSAGE)

    if not line:
        line = TEST_LINE

    while line:
        '''
        Loop continues as long as `line` is not empty
        '''

        handle_line(line)

        line = input(MESSAGE)

    count_of_unique_words = len(set_of_words.data.keys())
    unique_percentage = count_of_unique_words / count_of_words

    print('-------------------------')
    print('This song has {} words.'.format(count_of_words))
    print('{} of which are unique.'.format(count_of_unique_words))
    print('This song is {:.2%} unique words.'.format(unique_percentage))

    items = sorted(set_of_words.data.items(), key = lambda tup: tup[1], reverse=True)
    items = ["('{}', {})".format(k, v) for k, v in items]

    print('\n'.join(items[:3]))
    print('...')

run()

Если вы хотите обрабатывать тексты в Другие языки, вам следует проверить этот ссылка на сайт.

Другие вопросы по теме