Строка вводится с клавиатуры, удаляется из нее каждое слово нечетной длины

Обновлено: 21.11.2024

Проблема
Было ли это когда-нибудь с вами? Вы редактируете документ в Microsoft Word, и вдруг вместо вставки нового текста, который вы печатаете, с каждым нажатием клавиши вы удаляете и заменяете ваш существующий текст! Вот как это может выглядеть:

Представьте, что ваш документ Word содержит следующее предложение:
Это мой |интересный текст.

Затем вы помещаете текстовый курсор (вертикальная мигающая линия или «точка вставки») прямо перед словом «интересно» и набираете «замечательно». Вы намереваетесь вставить это слово. Обычно вы получите следующее:
Это мой замечательный|интересный текст.

Однако в этой безумной ситуации вместо этого вы получите следующее:
Это мой замечательный|ng текст.

9-значное слово "замечательный" заменило первые 9 символов слова "интересный", оставив вам слово "замечательный", которое, вероятно, не то, что вы хотели.

Объяснение: режим вставки (хороший) и режим замены (плохой)
Если вы столкнулись с таким странным поведением в Microsoft Word, это означает, что вы случайно переключились с «Режима вставки» (по умолчанию) на «Режим перепечатки». Справочная система Word описывает Overtype как режим, в котором вы «заменяете существующие символы по мере ввода».

Овертайп (также известный как зачеркивание или наложение текста) имел смысл несколько десятилетий назад, когда весь текст был моноширинным, т. е. все символы, которые вы вводили, имели одинаковую ширину. Например, вы можете построить грубую таблицу, используя пробелы для идеального выравнивания столбцов, а позже вы можете использовать режим Overtype, чтобы «перепечатать» части этой таблицы, чтобы обновить ее без вставки или смещения текста вправо.

Современные компьютеры и текстовые процессоры обычно используют шрифты с пропорциональным интервалом, где узкие буквы занимают меньше места, чем более широкие. Вот разница:

Моноширинный шрифт Courier, разные буквы имеют одинаковую ширину:
iiii
MMMM

Шрифт Verdana с пропорциональным интервалом, разные буквы имеют разную ширину
iiii
ММММ
(Однако даже в шрифтах с пропорциональным интервалом цифровые символы 0–9 обычно моноширинные, поэтому таблицы фигур выстраиваются правильно.)

Вот как можно отключить режим замены:

Как это может произойти. Если у вас полноразмерная клавиатура Windows, однократное нажатие клавиши "Вставить" переключает режим вставки и режим замены.

Как это исправить. Если вы оказались в режиме замены, просто еще раз нажмите клавишу «Вставить» на клавиатуре, и вы, вероятно, вернетесь в режим вставки. Чтобы убедиться, введите несколько символов в начале существующего абзаца.

Если у вас есть ноутбук с Windows и вы не можете найти ключ "insert", найдите ключ "INS". В зависимости от вашей клавиатуры вам также может потребоваться сначала удерживать клавишу-модификатор (например, "FN" или "Mode").

Затем закройте все документы Word (при необходимости сохраните изменения), закройте саму программу Word и снова откройте документ. (Если вы не уверены, закрыли ли вы Word, вы, безусловно, можете перезагрузить компьютер.) Это выведет вас из режима замены и вернется в режим вставки.

Чтобы отключить режим замены, вы открываете параметры Word, ищете "Изменить" или "Расширенное редактирование" (подробности будут зависеть от того, какая у вас версия Word), а затем снимите флажок "Режим замены".

Как это может произойти. Если у вас включена «Строка состояния» Microsoft Word в нижней части окна документа (это параметр в разделе «Вид»), возможно, вы случайно щелкнули кнопку «OVR», которая другой способ переключения между режимом вставки и режимом замены.

Когда режим замещения отключен (поэтому текст, который вы вводите inserts), вы увидите «OVR» в строке состояния, перед которым стоит белый кружок.

Когда режим Overtype включен, вы увидите «OVR» в строке состояния, перед которым стоит зеленый кружок.

Как это исправить: нажмите один раз кнопку "OVR" в строке состояния, и когда вы увидите, что ее маленький кружок изменится с зеленого на белый, вы вернетесь в режим вставки. Чтобы убедиться, введите несколько символов в начале существующего абзаца.

Чтобы отключить режим замены, откройте настройки Word, найдите «Изменить» или «Расширенное редактирование» (подробности будут зависеть от того, какая у вас версия Word), а затем снимите флажок «Режим замены».

  • Когда режим замены становится активным в одном открытом окне документа Word, он сразу же становится активным и во всех остальных открытых окнах Word. Аналогичным образом, отключение режима замены в любом открытом окне Word также отключит его во всех открытых окнах Word.
  • Закрытие и повторное открытие выключит режим замены только в том случае, если вы закроете программу (и, следовательно, все открытые окна Word) перед повторным открытием.
  • Перепечатывание не заменяет текст после конца абзаца и не удаляет разрывы абзацев или разделов, поэтому ваш потенциальный "ущерб" ограничен.Однако он удаляет разрывы строк, страниц и столбцов.
  • Если при сохранении изменений в документе был активен режим замены, этот факт не сохраняется в документе. Таким образом, если режим Overtype будет отключен в более позднем сеансе редактирования, повторное открытие этого документа не включит его снова.
  • При копировании и вставке текст всегда вставляется, даже если включен режим замены. Автотекст также всегда вставляется.
  • Откройте диалоговое окно «Настроить клавиатуру» Word (подробности будут зависеть от того, какая у вас версия Word).
  • Слева в разделе "Категории" прокрутите вниз и нажмите "Все команды".
  • Справа в разделе "Команды" прокрутите вниз и нажмите "Перепечатать".
  • В разделе "Текущие ключи" выберите "Вставить", затем нажмите "Удалить".
  • Нажмите "Закрыть", чтобы сохранить изменения.
  • Найдите свою версию Word (распространенные версии для Windows – 2003, 2007, 2010 и 2013; для Macintosh – 2004, 2008 и 2011), затем погуглите (замените "20xx" на свою версию): Word 20xx поверните отключить режим замены
  • Сохраняйте важные документы во время работы и делайте их резервные копии. Вы никогда не знаете, когда что-то может пойти не так, как в режиме Overtype. – Подробнее о клавише Insert.

Ваша конфиденциальность важна для меня. Я никому не передаю свой список рассылки бюллетеней и не сдаю его в аренду.

Авторское право (C) 2014 Kadansky Consulting, Inc. Все права защищены.

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

Эта статья предназначена для описания некоторых программ на Python, которые удаляют определенное слово (введенное пользователем) из строки (введенной пользователем). Вот список подходов, используемых для решения задачи:

  • Удалить слово из строки с помощью replace()
  • Использование списка

Удалить слово из строки с помощью replace()

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

Вот исходный результат, полученный этой программой Python:

Теперь введите входные данные, скажем, приветствие для взломщика кодов в виде строки, а затем в виде слова для удаления. Вот пример вывода с точно такими же входными данными:

Из приведенной выше программы следующий код (оператор):

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

Измененная версия предыдущей программы

Конец, используемый в этой программе, чтобы пропустить автоматическую вставку новой строки с помощью print(). + используется для объединения строк. И \" используется для печати " на выходе:

Вот его пример запуска со строковым вводом, так как это программирование на python, а затем ввод слова как python:

Вот еще один пример запуска с тем же вводом строки, но с вводом слов, как у взломщика кодов:

Примечание. Метод split() разбивает строку на слова.

Например, если строка, хранящаяся в тексте, представляет собой программирование на Python, то после выполнения следующего кода:

список с именем wordlist создается со своими значениями (элементами) как:

Примечание. "\b" используется для вставки обратного пробела при выводе. Этот escape-символ используется для перемещения предстоящего элемента отсюда на один пробел назад.

Удалить слово из строки с помощью списка

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

Вот его пример запуска с пользовательским вводом, добро пожаловать в взломщик кодов, чтобы изучить Python как строку и как слово для удаления:

Из приведенной выше программы следующее утверждение:

это краткая форма следующего блока кода:

Измененная версия предыдущей программы:

Это модифицированная версия предыдущей программы. Метод join() в этой программе используется таким образом, что список newtext преобразуется в строку:

Вот его пример запуска с тем же пользовательским вводом, что и в предыдущем примере программы:

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

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

Хотя у вас всегда есть возможность вручную выбирать и удалять строки, это неэффективно, если у вас большой набор данных.

Есть лучшие способы сделать это.

В этом руководстве я покажу вам несколько способов удаления каждой второй строки в Excel с помощью простой техники фильтрации. И если вы не против использовать код макроса VBA, я также дал короткий код VBA, который делает это одним щелчком мыши. Методы показаны в этом руководстве для всех версий Excel (2007, 2010, 2013 и 2016)

Хотя удалить каждую вторую строку в Excel может быть довольно просто, удалить каждый второй столбец может быть непросто. Это связано с тем, что вы не можете фильтровать столбцы в Excel (как вы можете фильтровать строки). В последнем разделе этого руководства я также покажу вам несколько способов удаления альтернативных столбцов (или каждого N-го столбца) в Excel.

Это руководство охватывает:

Удалить каждую вторую строку путем фильтрации набора данных (с использованием формулы)

Если бы вы могли каким-то образом отфильтровать все четные или нечетные строки, удалить эти строки/записи было бы очень просто.

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

Предположим, у вас есть набор данных, как показано ниже, в котором есть данные о продажах для каждого торгового представителя в двух регионах (США и Канада), и вы хотите удалить данные для Канады.

Ниже приведены шаги, которые нужно выполнить, чтобы сначала отфильтровать, а затем удалить все остальные строки (в которых есть данные по Канаде):

Вышеуказанные шаги фильтруют каждую вторую строку в наборе данных, а затем удаляют эти строки.

На этом этапе не беспокойтесь о значениях вспомогательного столбца. Результирующие данные содержат только строки для США, а все строки для Канады удалены. Теперь вы можете удалить вспомогательный столбец.

Если вы хотите удалить каждую вторую строку, начиная с первой строки и далее, выберите параметр ИСТИНА на шаге 7 и отмените выбор параметра ЛОЖЬ.

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

Хотя описанный выше метод хорош, у него есть два недостатка:

  1. Необходимо добавить новый столбец (HelperColumn в нашем примере выше)
  2. Это может занять много времени, если вам нужно часто удалять альтернативные строки.

Удалить каждую N-ю строку путем фильтрации набора данных (с использованием формулы)

В приведенном выше методе я показал вам, как удалить каждую вторую строку (альтернативную строку) в Excel.

И вы можете использовать ту же логику для удаления каждой третьей или четвертой строки в Excel.

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

Действия по удалению каждой третьей строки почти такие же, как и в предыдущем разделе (для удаления чередующихся строк). Единственное отличие заключается в формуле, используемой на шаге 2.

Ниже приведены шаги для этого:

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

На этом этапе не беспокойтесь о значениях вспомогательного столбца. Теперь вы можете удалить вспомогательный столбец.

В формуле, использованной на шаге 2, используется функция ОСТАТ, которая дает остаток от деления одного числа на другое. Здесь я использовал функцию ROW, чтобы получить номер строки и разделить его на 3 (потому что мы хотим удалить каждую третью строку).

Я приравниваю его к 1, и для каждой третьей строки формула MOD дает остаток равный 1.

Вы можете соответствующим образом изменить формулу. Например, если первая запись вашего набора данных начинается с третьей строки и далее, формула будет =MOD(ROW(),3)=2

Автоматическое удаление каждой второй строки (или N-й строки) с помощью макроса VBA (быстрый метод)

Если вам приходится удалять каждую вторую строку (или каждую n-ю строку) довольно часто, вы можете использовать код VBA и сделать его доступным на панели быстрого доступа. Это позволит вам быстро удалить чередующиеся строки одним щелчком мыши.

Ниже приведен код, который сначала предлагает вам выбрать диапазон, в котором вы хотите удалить альтернативные строки, а затем удалить каждую вторую строку в выбранном наборе данных.

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

Если вы хотите удалить каждую третью строку, вы можете использовать следующий код:

Куда поместить этот код макроса VBA?

Вам нужно поместить этот код в обычный модуль в редакторе VB в Excel.

Ниже приведены шаги, чтобы открыть редактор Vb, добавить модуль и поместить в него код:

После того как у вас есть код в редакторе VB, вы можете использовать следующие методы для запуска кода:

  • Запустите макрос из редактора VB (нажав зеленую кнопку воспроизведения на панели инструментов редактора VB)
  • Поместив курсор на любую строку кода и нажав клавишу F5
  • Назначая макрос кнопке/фигуре
  • Добавив макрос на панель быстрого доступа.

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

Если у вас есть код VBA в рабочей книге, вам необходимо сохранить его как поле с поддержкой макросов (с расширением .XLSM)

Примечание. Поскольку любые изменения, внесенные кодом VBA, необратимы, лучше сначала сделать резервную копию книги/листа, а затем запустить этот код.

Удалить каждый второй столбец (или каждый N-й столбец)

Удаление каждой альтернативной строки или каждой третьей/четвертой строки упрощается благодаря использованию параметра фильтра. Все, что вам нужно сделать, это использовать формулу, которая идентифицирует альтернативные строки (или каждую третью/четвертую строку) и фильтрует эти строки.

К сожалению, тот же метод не работает со столбцами, поскольку вы не можете фильтровать столбцы так же, как фильтруете строки.

Итак, если вам нужно удалить каждый второй столбец (или каждый третий/четвертый/N-й столбец), вам нужно проявить немного изобретательности.

В этом разделе я покажу вам два метода, которые вы можете использовать для удаления каждого второго столбца в Excel (и вы можете использовать тот же метод для удаления каждого третьего/четвертого/N-го столбца, если хотите).

Удалить альтернативные столбцы с помощью формул и метода сортировки

Предположим, у вас есть набор данных, как показано ниже, и вы хотите удалить все остальные столбцы (кроме столбца заголовка A)

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

Ниже приведены действия по удалению всех остальных столбцов в Excel:

Вышеуказанные шаги сортируют все столбцы и объединяют все альтернативные столбцы в одном месте (в конце).

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

Хотя это и не лучшее решение, оно все же делает свою работу.

Если вы хотите удалить каждый третий столбец или каждый четвертый столбец, вам необходимо соответствующим образом изменить формулу.

Удалить альтернативные столбцы с помощью VBA

Еще один быстрый способ удалить альтернативные столбцы — использовать приведенный ниже код VBA:

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

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

Если вы хотите удалить каждый третий столбец, вы можете использовать приведенный ниже код (и изменить его соответствующим образом, чтобы удалить N-й столбец)

Инструкции по размещению этого кода VBA и его использованию описаны в приведенном выше разделе под названием "Автоматическое удаление каждой второй строки (или N-й строки) с помощью макроса VBA (быстрый метод)"

До сих пор мы видели пять типов: int , float , bool , NoneType и стр . Строки качественно отличаются от остальных четырех, поскольку состоят из более мелких частей — символов.

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

Оператор квадратных скобок выбирает один символ из строки:

Выражение fruit[1] выбирает символ номер 1 из fruit . Переменная letter относится к результату. Когда мы отображаем letter , мы получаем сюрприз:

Первая буква "банан" не a , если только вы не компьютерщик. По извращенным причинам ученые-компьютерщики всегда начинают считать с нуля. Нулевая буква (zero-eth) слова "banana"b. 1-я буква ( one-eth ) — это a , а 2-я ( two-eth ) буква — n .

Если вам нужна нулевая буква строки, просто поместите 0 или любое выражение со значением 0 в скобки:

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

7.2. Длина¶

Функция len возвращает количество символов в строке:

Чтобы получить последнюю букву строки, у вас может возникнуть соблазн попробовать что-то вроде этого:

Это не сработает. Это вызывает ошибку времени выполнения IndexError: string index out of range . Причина в том, что в "банан" нет 6-й буквы. Поскольку мы начали считать с нуля, шесть букв пронумерованы от 0 до 5. Чтобы получить последний символ, мы должны вычесть 1 из length :

В качестве альтернативы мы можем использовать отрицательные индексы, которые ведут обратный отсчет от конца строки. Выражение fruit[-1] возвращает последнюю букву, fruit[-2] возвращает предпоследнюю и так далее.

7.3. Обход и цикл for

Многие вычисления включают обработку строки по одному символу за раз. Часто они начинаются с самого начала, выбирают по очереди каждого персонажа, что-то делают с ним и продолжают до конца. Этот шаблон обработки называется обходом. Один из способов кодирования обхода — оператор while:

Этот цикл проходит по строке и отображает каждую букву в строке отдельно. Условием цикла является index len(fruit) , поэтому, когда index равно длине строки, условие ложно, и тело цикла не выполняется. . Последний доступный символ — это символ с индексом len(fruit)-1 , который является последним символом в строке.

Использование индекса для обхода набора значений настолько распространено, что Python предоставляет альтернативный, более простой синтаксис — цикл for:

Каждый раз в цикле следующий символ в строке присваивается переменной char . Цикл продолжается до тех пор, пока не останется символов.

В следующем примере показано, как использовать конкатенацию и цикл for для создания абеседарианского ряда. Abecedarian относится к ряду или списку, в котором элементы расположены в алфавитном порядке. Например, в книге Роберта Макклоски Уступи дорогу утятам утят зовут Джек, Как, Лак, Мак, Нак, Уак, Стая и Шарлатан. Этот цикл выводит эти имена по порядку:

Вывод этой программы:

Конечно, это не совсем так, потому что Ouack и Quack написаны с ошибками. Вы исправите это в упражнении ниже.

7.4. Срезы строк¶

Подстрока строки называется срезом. Выбор фрагмента аналогичен выбору символа:

Операция [n:m] возвращает часть строки от n-го символа до m-го символа, включая первый, но исключая последний. Такое поведение противоречит здравому смыслу; имеет больше смысла, если вы представите индексы, указывающие между символами, как на следующей диаграмме:

Если опустить первый индекс (перед двоеточием), срез начинается с начала строки. Если вы опускаете второй индекс, срез идет в конец строки. Таким образом:

Как вы думаете, что означает s[:]?

7.5. Сравнение строк¶

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

Другие операции сравнения полезны для упорядочивания слов в лексиграфическом порядке:

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

Распространенный способ решить эту проблему — преобразовать строки в стандартный формат, например в нижний регистр, перед выполнением сравнения. Более сложная задача — заставить программу понять, что зебры — это не фрукты.

7.6. Строки неизменяемы¶

Заманчиво использовать оператор [] в левой части присваивания для изменения символа в строке. Например:

Вместо вывода Jello, world! этот код выдает ошибку времени выполнения TypeError: объект 'str' не поддерживает назначение элементов .

Строки неизменяемы, что означает, что вы не можете изменить существующую строку. Лучшее, что вы можете сделать, это создать новую строку, являющуюся вариацией исходной:

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

7.7. Оператор in

Оператор in проверяет, является ли одна строка подстрокой другой:

Обратите внимание, что строка является подстрокой самой себя:

Сочетая оператор in с конкатенацией строк с помощью + , мы можем написать функцию, которая удаляет все гласные из строки:

Протестируйте эту функцию, чтобы убедиться, что она делает то, что нам нужно.

7.8. Функция найти

Что делает следующая функция?

В некотором смысле find является противоположностью оператора []. Вместо того, чтобы брать индекс и извлекать соответствующий символ, он берет символ и находит индекс, в котором этот символ появляется. Если символ не найден, функция возвращает -1 .

Это первый пример использования оператора return внутри цикла. Если strng[index] == ch , функция немедленно завершает работу, преждевременно прерывая цикл.

Если символ не появляется в строке, программа нормально выходит из цикла и возвращает -1 .

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

7.9. Зацикливание и подсчет¶

Следующая программа подсчитывает, сколько раз буква a появляется в строке, и является еще одним примером шаблона счетчика, представленного в разделе Подсчет цифр:

7.10. Необязательные параметры¶

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

Вызов find2('banana', 'a', 2) теперь возвращает 3 , индекс первого появления 'a' в 'banana' после index 2. Что возвращает find2('banana', 'n', 3)? Если вы сказали 4, значит, вы понимаете, как работает find2.

Более того, мы можем объединить find и find2, используя необязательный параметр:

Вызов find('banana', 'a', 2) этой версии find ведет себя точно так же, как find2 , в то время как в для вызова find('banana', 'a') , start будет установлено значение по умолчанию 0 .

Добавление еще одного необязательного параметра к find приводит к поиску как вперед, так и назад:

Передача значения len(strng)-1 для начала и -1 для шага приведет к поиску в направлении начала строка вместо конца. Обратите внимание, что нам нужно было проверить нижнюю границу для index в цикле while, а также верхнюю границу, чтобы учесть это изменение.

7.11. Модуль string

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

Чтобы посмотреть, что внутри, используйте функцию dir с именем модуля в качестве аргумента.

который вернет список элементов внутри строкового модуля:

['Шаблон', '_TemplateMetaclass', '__builtins__', '__doc__', '__file__', '__name__', '_float', '_idmap', '_idmapL', '_int', '_long' , '_multimap', '_re', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'atof', 'atof_error', 'atoi', 'atoi_error', 'atol', 'atol_error', 'capitalize', ' capwords», «center», «count», «digits», «expandtabs», «find», «hexdigits», «index», «index_error», «join», «joinfields», «letters», «ljust» , 'нижний', 'строчный регистр', 'lstrip', 'maketrans', 'octdigits', 'для печати', 'знак препинания', 'заменить', 'rfind', 'rindex', 'rjust', 'rsplit', ' rstrip', 'split', 'splitfields', 'strip', 'swapcase', 'translate', 'upper', 'uppercase', 'whitespace', 'zfill']

Чтобы узнать больше об элементе в этом списке, мы можем использовать команду type. Нам нужно указать имя модуля, за которым следует элемент, используя точечную нотацию.

Поскольку string.digits — это строка, мы можем напечатать ее, чтобы увидеть, что она содержит:

Неудивительно, что он содержит каждую десятичную цифру.

string.find — это функция, которая делает почти то же самое, что и функция, которую мы написали. Чтобы узнать о ней больше, мы можем распечатать строку документации, __doc__, которая содержит документацию по функции:

Параметры в квадратных скобках являются необязательными. Мы можем использовать string.find во многом так же, как и наш собственный find :

Этот пример демонстрирует одно из преимуществ модулей — они помогают избежать конфликтов между именами встроенных и пользовательских функций. Используя запись через точку, мы можем указать, какую версию find мы хотим.

На самом деле, string.find носит более общий характер, чем наша версия. он может находить подстроки, а не только символы:

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

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

В этом примере поиск завершается ошибкой, поскольку буква b отсутствует в индексном диапазоне от 1 до 2 (не включая < тт>2 ).

7.12. Классификация персонажей¶

Часто полезно изучить символ и проверить, является ли он прописным или строчным, а также является ли он символом или цифрой. Модуль string предоставляет несколько констант, полезных для этих целей. Один из них, string.digits, мы уже видели.

Строка string.lowercase содержит все буквы, которые система считает строчными. Точно так же string.uppercase содержит все буквы верхнего регистра. Попробуйте следующее и посмотрите, что получится:

Мы можем использовать эти константы и find для классификации символов. Например, если find(lowercase, ch) возвращает значение, отличное от -1 , тогда ch должен быть строчным:

В качестве альтернативы мы можем воспользоваться оператором in:

В качестве еще одной альтернативы мы можем использовать оператор сравнения:

Если ch находится между a и z, это должна быть строчная буква.

Еще одна константа, определенная в модуле string, может удивить вас, когда вы ее распечатаете:

Пробелы перемещают курсор, ничего не печатая. Они создают пустое пространство между видимыми символами (по крайней мере, на белой бумаге). Константа string.whitespace содержит все пробельные символы, включая пробел, табуляцию ( \t ) и новую строку ( \n ).

7.13. Форматирование строк¶

Самый краткий и эффективный способ форматирования строки в Python — это использование оператора форматирования строки, %, вместе с операциями форматирования строки Python. Чтобы понять, как это работает, давайте начнем с нескольких примеров:

Синтаксис операции форматирования строки выглядит следующим образом:

Он начинается с формата, который содержит последовательность символов и спецификации преобразования. Спецификации преобразования начинаются с оператора %. За строкой формата следует один %, а затем последовательность значений, по одному для каждой спецификации преобразования, разделенных запятыми и заключенных в круглые скобки. Скобки необязательны, если имеется только одно значение.

В первом примере выше есть единственная спецификация преобразования, %s , которая указывает на строку. Единственное значение "Arthur" соответствует ему и не заключено в круглые скобки.

Во втором примере name имеет строковое значение, "Alice" , а age имеет целочисленное значение, 10 . Они соответствуют двум спецификациям преобразования: %s и %d . d во второй спецификации преобразования указывает, что значение представляет собой десятичное целое число.

s , d и f — это все типы преобразования, которые нам понадобятся для этой книги.Полный список см. в разделе «Операции форматирования строк» ​​Справочника по библиотеке Python.

Следующий пример иллюстрирует реальную пользу форматирования строк:

Эта программа выводит таблицу различных степеней чисел от 1 до 10. В своей текущей форме она использует символ табуляции ( \t ) для выравнивания столбцов значений, но это ломается, когда значения в таблице превышают ширину табуляции из 8 символов:

Одним из возможных решений может быть изменение ширины вкладки, но в первом столбце уже больше места, чем нужно. Лучшим решением будет установить ширину каждого столбца независимо. Как вы, возможно, уже догадались, форматирование строк обеспечивает решение:

Запуск этой версии приводит к следующему выводу:

Значок - после каждого % в спецификации преобразования указывает на выравнивание по левому краю. Числовые значения указывают минимальную длину, поэтому %-13d — это число, выровненное по левому краю, шириной не менее 13 символов.

7.14. Резюме и первые упражнения¶

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

индексирование ( [] ) Доступ к одному символу в строке с использованием его позиции (начиная с 0). Пример: 'This'[2] оценивается как 'i' . Функция длины ( len ) Возвращает количество символов в строке. Пример: len('happy') оценивается как 5 . для обхода цикла ( for )

Обход строки означает доступ к каждому символу в строке по одному. Например, следующий цикл for:

оценивается как EE xx aa mm pp ll ee

срез ( [:] ) срез — это подстрока строки. Пример: 'bananas and cream'[3:6] оценивается как ana (так же, как и 'bananas and cream'[1:4] ). . сравнение строк ( >, >=, == ) Операторы сравнения работают со строками, оценивая их в соответствии с лексиграфическим порядком. Примеры: 'apple' 'banana' оценивается как True . 'Zeta' 'Appricot' оценивается как False . 'Zebra' 'aardvark' оценивается как True, поскольку все прописные буквы предшествуют строчным. оператор in ( in ) Оператор in проверяет, содержится ли один символ или строка внутри другой строки. Примеры: 'heck' в "Я тебя проверю." оценивается как True . 'cheese' в "Я проверю для вас." оценивается как False .

7.14.1. Первые упражнения¶

Запишите оценку интерпретатора Python для каждого из следующих выражений:

Напишите код Python, чтобы пройти каждый из следующих тестов документации:

7.15. Глоссарий¶

составной тип данных Тип данных, в котором значения состоят из компонентов или элементов, которые сами являются значениями. значение по умолчанию Значение, присвоенное необязательному параметру, если в вызове функции для него не указан аргумент. docstring Строковая константа в первой строке определения функции или модуля (а также, как мы увидим позже, в определениях классов и методов). Строки документации предоставляют удобный способ связать документацию с кодом. Строки документации также используются модулем doctest для автоматизированного тестирования. запись через точку Использование оператора точки . для доступа к функциям внутри модуля. immutable Составной тип данных, элементам которого не могут быть присвоены новые значения. index Переменная или значение, используемое для выбора члена упорядоченного набора, например символа из строки. необязательный параметр Параметр, записанный в заголовке функции с присвоением значения по умолчанию, которое он получит, если для него не задан соответствующий аргумент в вызове функции. срез Часть строки (подстроки), определяемая диапазоном индексов. В более общем смысле подпоследовательность любого типа последовательности в Python может быть создана с помощью оператора среза ( sequence[start:stop] ). traverse Перебирать элементы набора, выполняя аналогичную операцию над каждым. пробел Любой из символов, которые перемещают курсор без печати видимых символов. Константа string.whitespace содержит все пробельные символы.

7.16. Упражнения¶

чтобы Ouack и Quack были написаны правильно.

в функцию с именем count_letters и обобщить ее, чтобы она принимала строку и букву в качестве аргументов.

Теперь перепишите функцию count_letters так, чтобы вместо обхода строки она неоднократно вызывала find (версия из Необязательные параметры) с необязательный третий параметр для обнаружения новых вхождений подсчитываемой буквы.

Какая версия is_lower, по вашему мнению, будет самой быстрой? Можете ли вы назвать другие причины, помимо скорости, чтобы предпочесть ту или иную версию?

Создайте файл с именем stringtools.py и поместите в него следующее:

Добавьте тело функции в reverse, чтобы пройти doctests.

Добавить зеркало в stringtools.py .

Напишите для нее тело функции, которое заставит ее работать, как указано в doctests.

Включить remove_letter в stringtools.py .

Напишите для нее тело функции, которое заставит ее работать, как указано в doctests.

Это то, что случалось со мной в прошлом много раз.

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

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

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

Теперь, когда мы знаем о проблеме, как мы можем ее исправить?

В этом посте мы рассмотрим различные способы удаления этих нежелательных лишних пробелов из наших данных.

Наши примеры данных для поста

В этом посте мы рассмотрим простой набор данных. Это просто «Привет, мир!» снова и снова, но с дополнительными пробелами.

  1. Здесь нет лишних пробелов. Это всего лишь элемент управления, чтобы убедиться, что при применении нашего исправления мы не нарушаем что-то правильное.
  2. Выглядит нормально, но на самом деле в конце добавлено 5 пробелов.
  3. В начале добавлено 5 пробелов. Ведущие пробелы гораздо легче заметить.
  4. Здесь у нас есть как начальные, так и конечные пробелы в данных.
  5. Между словами есть пара пробелов. В данном случае это очевидно, так как я добавил 5 пробелов между словами. Если бы у нас было только 2 пробела, было бы намного сложнее заметить это в зависимости от используемого шрифта.
  6. У этого есть все три возможности. Ведущий, замыкающий и промежуточный.

Давайте посмотрим, как мы можем все это исправить!

Удаление лишних пробелов с помощью функции TRIM

Первый метод, который мы рассмотрим, самый простой.

Лишние пробелы — настолько распространенная проблема, что существует функция их удаления (или обрезки). Это функция TRIM.

Он делает именно то, что кажется возможным. Он обрезает любые лишние пробелы из данных. Он удаляет все пробелы из текстовой строки, кроме одиночных пробелов между словами.

У функции TRIM есть один обязательный ввод, и это текст, из которого мы хотим обрезать лишние пробелы. Входными данными могут быть либо ссылка на ячейку, например B2, либо жестко заданная строка, например «Hello World! “.

TRIM(B2) вернет содержимое ячейки B2 с удаленными лишними пробелами.

TRIM("Hello World!") вернет "Hello World!".

Удаление лишних пробелов между словами с помощью функции «Найти и заменить»

Следующий метод будет использовать функцию поиска и замены Excel.

Это сработает только для удаления лишних пробелов между словами.

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

Затем перейдите на вкладку «Главная» ➜ раздел «Редактирование» ➜ нажмите кнопку «Найти и выбрать» ➜ выберите в меню пункт «Заменить».

Вы также можете использовать сочетание клавиш Ctrl + H.

В обоих случаях открывается меню «Найти и заменить», и мы можем нажать кнопку «Параметры», чтобы получить дополнительные параметры поиска и замены.

В разделе «Найти что» нам нужно добавить два пробела. Мы можем дважды нажать пробел на клавиатуре.

В разделе «Заменить на» нам нужно добавить один пробел. Мы можем один раз нажать пробел на клавиатуре.

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

Убедитесь, что выбраны другие расширенные параметры "В пределах листа" и "Искать в формулах".

Нажмите кнопку "Заменить все". Поскольку в наших данных есть строки из 5 пробелов, нам нужно несколько раз нажать кнопку «Заменить все», пока в данных больше не будут обнаружены символы двойного пробела.

Это оставит один пробел в начале или в конце данных, если там были пробелы.

Удаление лишних пробелов с помощью Power Query

Power Query предназначен для преобразования данных, поэтому он должен справляться с этой задачей.

Выберите данные и перейдите на вкладку «Данные» ➜ нажмите команду «Из таблицы/диапазона».

Это превратит наши данные в таблицу Excel, если она еще не отформатирована как таковая.

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

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

Щелкните правой кнопкой мыши заголовок столбца ➜ выберите «Преобразовать» ➜ выберите «Обрезать».

К сожалению, это не удаляет лишние пробелы между словами, и для этого нам нужно реализовать пару шагов преобразования «Заменить значения».

Щелкните правой кнопкой мыши столбец и выберите в меню Заменить значения.

Как и в случае с методом поиска и замены, нам потребуется добавить два пробела в качестве значения для поиска и один пробел в качестве значения «Заменить на». Затем мы можем нажать кнопку OK, чтобы добавить это преобразование.

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

Чтобы вернуть очищенные данные обратно в Excel, нам нужно закрыть и загрузить данные.

Мы можем перейти на вкладку «Главная» в редакторе запросов Power ➜ нажать «Закрыть и загрузить» ➜ выбрать «Закрыть и загрузить в» ➜ выбрать таблицу и указать место для загрузки таблицы.

Удаление лишних пробелов между словами с помощью VBA

VBA также имеет встроенную функцию обрезки.

Приведенный выше код будет перебирать каждую ячейку в выбранном диапазоне и применять функцию VBA Trim к значению внутри ячейки.

Подобно преобразованию Power query Trim, оно удалит только пробелы в начале и в конце любого текста.

Выводы

Существует множество способов удаления лишних пробелов в наших данных.

Мы рассмотрели формулы, поиск и замену, расширенный запрос и VBA.

На мой взгляд, простая функция TRIM — самый простой и эффективный способ.

Об авторе

Джон МакДугалл

Джон — Microsoft MVP, внештатный консультант и тренер, специализирующийся на Excel, Power BI, Power Automate, Power Apps и SharePoint. Другие интересные статьи Джона можно найти в его блоге или на канале YouTube.

Читайте также: