Python - удаление пробелов и знаков препинания без функций

Прежде всего, извините за мой плохой английский. Я начинающий программист, и у меня есть некоторые проблемы с моей программой на Python. Я должен сделать программу, которая нормализует пробелы и знаки препинания, например:

Если я положу строку с именем

"   hello   how,   are  u?   "

Новая строка должна быть...

"Hello how are u"

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

 "helloo how,, aree u??"

Примечание: я не могу использовать какие-либо функции, такие как split(), strip() и т. Д.

Вот мой код:

from string import punctuation

print("Introduce your string: ")
string = input() + " "
word = ""
new_word = ""
final_string = ""

#This is the main code for the program
for i in range(0, len(string)):
    if (string[i] != " " and (string[i+1] != " " or string[i+1] != punctuation)):
        word += string[i]
    if (string[i] != " " and (string[i+1] == " " or string[i+1] == punctuation)):
        word += string[i] + " "
        new_word += word
        word = ""

#This destroys the last whitespace
for j in range(0,len(new_word)-1):
    final_string += new_word[j]

print(final_string)

Спасибо вам всем.

РЕДАКТИРОВАТЬ:

Теперь у меня есть этот код:

letter = False

for element in my_string:
    if (element != " " and element != punctuation):
        letter= True
        word += element


print(word)

Но теперь проблема в том, что моя программа не распознает пунктуацию, поэтому, если я поставлю:

"Hello   ... how  are u?"

Это должно быть как "Hellohowareu"

Но это как:

"Hello...howareu?

3 ответа

Я не собираюсь писать код для вас, так как это, очевидно, домашнее задание, но я дам вам несколько советов.

Я думаю, что ваш подход проверки следующего символа немного подвержен ошибкам. Скорее у меня был бы флаг, который вы устанавливаете, когда видите пробел или пунктуацию. В следующий раз в цикле проверьте, установлен ли флаг: если он установлен, и вы по-прежнему видите пробел, игнорируйте его, в противном случае сбросьте флаг на false.

Итак, во-первых, вам не нужно перебирать диапазон, строки в python являются итеративными. Например:

my_string = 'How are you?'

for char in my_string:
  #do something each character

Во-вторых, вы используете очень пятнистую методологию для того, что вы хотите удалить. Кажется, ваш метод для отлова пробелов, которые появляются после символа, вызывает двойное добавление последнего символа. Я бы использовал другой метод, гораздо более сосредоточенный на том, где вы находитесь, а не на том, что перед вами.

Теперь это очень похоже на домашнюю работу, так что вот мое решение для обработки потоков, если вы можете объяснить это своему учителю, я сомневаюсь, что они будут возражать, что вы на самом деле не делали это сами

def filter(inp):
    for i in inp:
        yield " " if i in " ,.?!;:" else i

def expand(inp):
    for i in inp:
        yield None if i == " " else object(), i

def uniq(inp):
    last = object()
    for key, i in inp:
        if key == last:
            continue
        yield key, i

def compact(inp):
    for key, i in inp:
        yield i

normalised = compact(uniq(expand(filter(input()))))
Другие вопросы по тегам