Nano Hash - криптовалюты, майнинг, программирование

Regexmatch, чтобы найти все строковые ячейки, соответствующие нескольким словам

Я использую комбинацию ArrayFormula и FILTER, чтобы перечислить все ячейки в столбце, содержащие все слова поискового запроса. Я использую REGEXMATCH, а не QUERY / CONTAINS / LIKE, потому что мой ФИЛЬТР имеет другие критерии, которые возвращают ИСТИНА / ЛОЖЬ.

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

=ArrayFormula(filter(A1:A5,regexmatch(A1:A5,"(?i)^"&"(.*?\bbob\b)(.*?\bcat\b)"&".*$")))

Он найдет Боба и кота, но только если Боб опережает кота.

Таблицы Google не работают, если я пытаюсь использовать опережающий просмотр? = Т.е.

=ArrayFormula(filter(A1:A5,regexmatch(A1:A5,"(?i)^"&"(?=.*?\bbob\b)(?=.*?\bcat\b)"&".*$")))

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

Вот тестовый поисковый массив (каждая строка - это отдельная ячейка, содержащая строку) ...

Bob ate the dead cat
The cat ate live bob
No cat ate live dog
Bob is dead
Bob and the cat are alive

... и желаемых результатов я добиваюсь.

Bob ate the dead cat
The cat ate live bob
Bob and the cat are alive

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

31.05.2017

  • Механизм RE2 не поддерживает предварительные просмотры, которые могут проверять шаблоны без использования текста. Таким образом, единственный обходной путь - использовать несколько функций сопоставления: and(regexmatch(A1:A5,'(?i)\bBob\b'), regexmatch(A1:A5, '(?i)\bcat\b')). 31.05.2017

Ответы:


1

Найдите 2 строки

Пытаться:

=FILTER(A:A,REGEXMATCH(A:A,"(?i)bob.*cat|cat.*bob"))

Вам не нужно использовать ArrayFormula, потому что фильтр - это сама формула массива.

  • (?i) - сделать поиск нечувствительным к регистру
  • bob.*cat|cat.*bob - совпадение «боб → кот» или «кот → боб»

Найдите несколько строк

Есть более сложная формула для большего количества слов, чем 2.

Предположим, у нас есть список в столбце A:

Bob ate the dead cat
The cat ate live bob
No cat ate live dog
Bob is dead
Bob and the cat are alive
Cat is Bob
ate Cat bob

И нужно найти все совпадения из 3 слов, поместить их в столбец C:

cat
ate
bob

Формула:

=FILTER(A:A,MMULT(--REGEXMATCH(A:A, "(?i)"&TRANSPOSE(C1:C3)),ROW(INDIRECT("a1:a"&COUNTA(C1:C3)))^0)=COUNTA(C1:C3))

Он использует RegexMatch транспонированного списка слов C1:C3, а затем mmult функция суммирует совпадения и =COUNTA(C1:C3) сравнивает количество совпадений с количеством слов в списке.

Результат:

Bob ate the dead cat
The cat ate live bob
ate Cat bob
01.06.2017
  • На первый взгляд «Несколько строк» ​​кажется идеальным решением. Большое спасибо Макс. Мне нужно потратить некоторое время на это сейчас, чтобы полностью понять, как я могу интегрировать его в реальную задачу. В любом случае, я с нетерпением дал вам «Лучший ответ». 01.06.2017

  • 2

    Посмотрите, делает ли это то, что вы хотите. В B1 введите:

    =arrayformula(filter(A1:A5,regexmatch(A1:A5,lower(index(split(C2," "),0,1)))*regexmatch(lower(A1:A5),lower(index(split(C2," "),0,2)))))
    

    В C2 введите искомые слова с пробелом между ними (кот Боб).

    Все слова заменены на нижний регистр. Разделение индекса разделяет слова в C2, и отдельные слова входят в regexmatch. Ниже представлена ​​моя общая тестовая таблица:

    https://docs.google.com/spreadsheets/d/1sDNnSeqHbi0vLosxhyr8t8KXa3MzWC_WJ26eSVNnG80/edit?usp=sharing

    Расширяя очень хороший ответ Макса, это изменит формулу для списка слов в столбце C. Я добавил пример в общую электронную таблицу (Sheet2).

    =FILTER(A:A,MMULT(--REGEXMATCH(A:A,"(?i)"&TRANSPOSE(INDIRECT( "C1:C" & counta(C1:C ) ))),ROW(INDIRECT("a1:a"&COUNTA(INDIRECT( "C1:C" & counta(C1:C ) ))))^0)=COUNTA(INDIRECT( "C1:C" & counta(C1:C ) )))
    
    31.05.2017
  • и @Wiktor оба ответа работают с заданными данными, поэтому спасибо за это. Мне нужно проанализировать и разделить данные, чтобы оба ваших ответа были достаточно гибкими для использования в более широком плане. Итак, будет ли '= COUNTA (SPLIT (C2,)) эффективным способом подавать сообщения if перед каждым экземпляром' Condition '? 01.06.2017

  • 3

    Может быть, немного легче понять (я ненавижу MMULT)

    = query ({A1: A}, выберите Col1, где & join (и, arrayformula (Col1 соответствует '. & filter (B: B, B: B ‹›) &.')))

    Где A содержит список фраз, а B содержит слова критериев.

    Эта часть формулы, = join (и, arrayformula (Col1 соответствует '. & filter (D3: D, D3: D ‹›) &.')) строит строку запроса из терминов в B. Например:

    Col1 соответствует '. cats.', а Col1 соответствует '. dogs.'

    И затем этот список объединяется во все выражение выбора:

    выберите Col1, где Col1 соответствует '. cats.', а Col1 соответствует '. dogs.'

    28.05.2021
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..