1

У меня есть лист Excel с предложениями (всего 50), все в разных строках. Я должен извлечь последнее слово в каждом предложении, исключая знаки препинания. Предложения имеют разное количество символов. Первое предложение «Мэри играет на пианино».

Проблема с Excel

Я сделал это с помощью 2 разных клеток. Одна клетка =RIGHT(J1,6) вынимает piano. Следующая ячейка ссылается на эту единицу и является =Substitute(S1,"."," ") Который вынимает период.

Я хотел бы объединить 2 в одной ячейке и иметь возможность автоматически заполнить все 50 предложений. Другие предложения не имеют одинаковое количество символов и имеют различную пунктуацию. Какая формула подойдет для этого? Я предполагаю формулу подстановки вместе с RIGHT?

2 ответа2

0

Вы определенно находитесь на правильном пути с функциями RIGHT() и SUBSTITUTE() .

Давайте пройдемся по процессу обобщения и объединения формул.

Для этого мы будем работать с предложением What to do? в A1 ваша RIGHT() формула в B1 , и ваша SUBSTITUTION() формулы в C1 . Таким образом, ваши формулы будут =RIGHT(A1,3) и =SUBSTITUTE(B1,"?",""):

Скриншот рабочей книги

Шаг 1

Нам нужно обобщить:

<1> RIGHT(A1,3)

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

Для нашего примера длина равна 11, а индекс последнего пробела равен 8,

What to do?
       ↑  ↑
12345678  11

и 11 - 8 → 3

Длина может быть рассчитана с помощью:

<2> LEN(A1)

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

Формула для замены:

<3>  SUBSTITUTE(A1," ","§",2)

где 2 - номер вхождения последнего пробела, то есть 2-го пробела, и, надеюсь, § не существует.

Затем мы можем использовать <3> чтобы найти индекс последнего пробела следующим образом:

<4>  FIND("§",SUBSTITUTE(A1," ","§",2))

Но как мы решаем 2? Это немного сложно. Обратите внимание, что номер вхождения последнего пробела в предложении совпадает с количеством пробелов в предложении.

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

<5>  LEN(A1)-LEN(SUBSTITUTE(A1," ",""))

Включение этого обратно в <4> приводит к формуле для индекса последнего пробела:

<6>  FIND("§",SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))

Вычитание этого из <2> приводит к длине последнего слова:

<7>  LEN(A1)-FIND("§",SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))

Подключение <7> обратно к <1> приводит к обобщенному

<8>  RIGHT(A1,LEN(A1)-FIND("§",SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))


Шаг 2

Нам нужно обобщить:

<9> SUBSTITUTE(B1,"?","")

Теперь, так как SUBSTITUTE() возвращает неизмененную целевую строку, если в ней не может быть найдена строка поиска, мы можем "связать" более одной этой функции, чтобы удалить несколько возможных знаков пунктуации. Например, чтобы также удалить ! мы бы сделали это:

<10> SUBSTITUTE(<9>,"!","")

Подключение <9> к <10> дает:

<11> SUBSTITUTE(SUBSTITUTE(B1,"?",""),"!","")

Поскольку есть только три знаки препинания в конце ? ! и . (Я надеюсь), <10> можно полностью обобщить на это:

<12>  SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B1,"?",""),"!",""),".","")


Шаг 3

Объединение двух формул - это простой вопрос замены B1 в <12> на <8> , что приводит к решению:

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(RIGHT(A1,LEN(A1)-FIND("§",SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))),"?",""),"!",""),".","")

Заметки:

Если в конце предложения нет знаков препинания (как в случае предложения 21, показанного на скриншоте), функции SUBSTITUTE() фактически ничего не делают, и последнее слово корректно возвращается.

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

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

0

Я использую бесплатную надстройку Excel RegEx Find/Replace, чтобы получить функциональность регулярных выражений. Это облегчает жизнь в такой ситуации, как ваша.

При этом формула будет выглядеть так:
=RegExReplace(A1,".* ([a-zA-Z]+)[.?!]*$","$1")

Куда:

  • =RegExReplace(A1,...) просматривает содержимое A1
  • .* - для чего-либо в ячейке, законченной пробелом
  • ([a-zA-Z]+) - сопровождается словом (которое может содержать буквы верхнего и нижнего регистра) и запоминает это слово
  • [.?! ]* - сопровождается любым числом (включая 0) знаков препинания и пробела
  • $" - незадолго до конца ячейки
  • ,"$1" - затем заменяет все содержимое ячейки запоминаемым словом.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .