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

#python #for-loop

Вопрос:

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

 string_salada_russa = ' !! LeTRas PeqUEnAS amp; GraNdeS'  clean_string = string_salada_russa.lower().strip()   print(clean_string)  i = 0  for c in clean_string:  if(c.isalpha() == False and c != " "):  clean_string = clean_string.replace(c, "").strip()   print(clean_string)  for c in clean_string:  if(i gt;= 1 and i lt;= len(clean_string)-1):  if(clean_string[i] == " " and clean_string[i-1] == " " and clean_string[i 1] == " "):  clean_string = clean_string.replace(clean_string[i], "")  i  = 1     print(clean_string)   

Ожидаемый результат будет:

 #original string ' !! LeTRas PeqUEnAS amp; GraNdeS'  #expected 'letras pequenas grandes'  #actual outcome 'letraspequenasgrandes'  

Я пытаюсь удалить лишние пробелы, однако безуспешно. В итоге я удаляю ВСЕ пробелы.

Кто-нибудь может помочь мне разобраться в этом? Что не так в моем коде?

Комментарии:

1. Вероятно, это происходит потому, что вы сокращаете clean_string время, повторяя его. Лучшей стратегией может быть повторение clean_string и копирование букв, которые вы хотите сохранить, в другую строку (или, что еще лучше, в список, который вы затем объедините, когда закончите).

Ответ №1:

Как насчет использования re ?

 import re  s = ' !! LeTRas PeqUEnAS amp; GraNdeS' s = re.sub(r"[^a-zA-Z] ", " ", s.lower()).strip() print(s) # letras pequenas grandes  

Это сначала переводит буквы в нижний регистр ( lower ), заменяет каждый ряд неалфавитных символов на один пробел ( re.sub ), а затем удаляет пробелы вокруг строки ( strip ).

Кстати, ваш код не выводится 'letraspequenasgrandes' . Вместо этого он выводит 'letrasZpequenasZZZZZgrandes' данные .

Ответ №2:

Вам могло бы сойти с рук сочетание str.lower() , str.split() , str.join() и str.isalpha() :

 def clean(s):  return ' '.join(x for x in s.lower().split(' ') if x.isalpha())   s = ' !! LeTRas PeqUEnAS amp; GraNdeS' print(clean(s)) # letras pequenas grandes  

В принципе, вы сначала конвертируете в меньшее и делите на ' ' . После этого вы отфильтровываете не-альфа-токены и присоединяете их обратно.

Ответ №3:

Нет необходимости удалять строку на каждой итерации первого цикла for; но, кроме этого, вы могли бы сохранить первую часть своего кода:

 for c in clean_string:  if (c.isalpha() == False and c != " "):  clean_string = clean_string.replace(c, "")  

Затем разделите строку, эффективно удалив все пробелы, и снова соедините слово в одну строку с одним пробелом между каждым словом:

 clean_string = " ".join(clean_string.split())  

Комментарии:

1. Обратите внимание, что это будет несколько неэффективно, так как вся строка будет копироваться на каждой итерации при наличии недопустимого символа.