Регулярное выражение, которое соответствует 4 или более слов из списка - PullRequest
1 голос
/ 11 февраля 2020

Фон

У нас есть система, которая поддерживает хранилище регулярных выражений и проверяет некоторый входящий текст на соответствие этим регулярным выражениям для некоторых целей фильтрации. Одно из регулярных выражений, которое мы пытаемся построить, описано ниже. Решение, которое я ищу, основано на регулярных выражениях из-за производственных ограничений.

Задача

У меня есть список слов: word1, word2, word3, word4, word5, word6, word7, слово8, слово9, слово10. Я пытаюсь написать регулярное выражение, соответствующее строке, если оно содержит 4 или более этих слов, в любых позициях в любом порядке.

Примеры

  • "Ab c word3 def word2 ghi word7 jkl word1 mno word5 "должно быть совпадением, поскольку в нем содержится более 4 слов из данного списка.
  • " Ab c word2 def ghi word8 "не должно совпадать, поскольку в этом списке только 2 слова.

Текущее состояние

У меня есть следующее регулярное выражение, но, похоже, оно не выполняет то, что мне нужно.

((?i)((word1)|(word2)|(word3)|(word4)|(word5)|(word6)|(word7)|(word8)|(word9)|(word10))\b){4,}

Любые предложения, пожалуйста, в Java или Python записи?

Редактировать: Добавлена ​​некоторая справочная информация.

Ответы [ 3 ]

1 голос
/ 11 февраля 2020

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

wrd_list = ["word1", "word2", "word3", "word4", "word5", "word6", "word7", "word8", "word9", "word10"]

s = "Abc word3 def word2 ghi word7 jkl word1 mno word5"

if len(set(wrd_list).intersection(s.split())) > 4:
    print('more than 4 occurrences found')

РЕДАКТИРОВАТЬ: Это код в Python

0 голосов
/ 11 февраля 2020

Следующие регулярные выражения работали для всех моих тестов:

(?i)(.*(^|\b)((word1)|(word2)|(word3)|(word4)|(word5)|(word6)|(word7)|(word8)|(word9)|(word10))($|\b).*){4,}

Они включают в себя:

  1. "Ab c word3 def word2 ghi word7 jkl word1 mno word5" -> true
  2. "Ab c word2 def ghi word8" -> false
  3. "word3 sadasd sadasd word1 word2 word4" -> true
  4. "word3 sadasd sadasd word1 word2word4" -> false
  5. "aword3 sadasd sadasd word1 word2 word4" -> false
  6. "word3 sadasd sadasd word1 word2 word4a" -> false

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

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

0 голосов
/ 11 февраля 2020

Возможно, это (не регулярное выражение, но я думаю, что более читабельным):

words = ['word1', 'word2', 'word3', 'word4', 'word5', 'word6', 'word7', 'word8', 'word9', 'word10']
text = "Abc word2 def ghi word8"
sum(i in text for i in words)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...