#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. Обратите внимание, что это будет несколько неэффективно, так как вся строка будет копироваться на каждой итерации при наличии недопустимого символа.