Регулярные выражения Python 0 или более слов из множества - PullRequest
0 голосов
/ 07 января 2019

У меня большой блок текста, в котором я пытаюсь найти фразу. Фраза может быть структурирована различными способами.

  1. Сначала я хочу найти слово из набора слов, давайте назовем его установить 1.
  2. После этого должен быть пробел или запятая (или, может быть, что-то еще что разделяет слова)
  3. Тогда может быть 0 или более слов из набора 2
  4. Снова следуют символы разделения слов, как в пункте 2 выше
  5. наконец, должно быть слово из множества 3

В идеале все они должны быть в одном предложении.

набор 1 = (Potential|Ability|Possibility|need|requires|needs|plenty|for|Needing|Requiring)

набор 2 = (for|to|of|full|a|be|complete|Internal)

набор 3 = (renovate|improve|modernise|modernize|update|renovating|improving|modernising|modernizing|updating|potential|project|renovation)

Итак, у меня есть это регулярное выражение

(Potential|Ability|Possibility|need|requires|needs|plenty|for|Needing|Requiring)[ ,]*(for|to|of|full|a|be|complete|Internal)[ ,]*(renovate|improve|modernise|modernize|update|renovating|improving|modernising|modernizing|updating|potential|project|renovation)

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

, как только я добавляю «а» до «завершения», происходит сбой. Так же, как если бы я добавил еще одно «завершено».

Как указать, чтобы искать 0 или несколько слов из набора?

Ответы [ 4 ]

0 голосов
/ 07 января 2019

Вы должны использовать это регулярное выражение:

(Potential|Ability|Possibility|need|requires|needs|plenty|for|Needing|Requiring)[ ,](for|to|of|full|a|be|complete|Internal)*[ ,](renovate|improve|modernise|modernize|update|renovating|improving|modernising|modernizing|updating|potential|project|renovation)

Потому что у вас есть одно слово из первого набора. После этого у вас есть один пробел или запятая. Рядом с вами есть 0 или более слов из набора 2. Затем другой пробел или запятая и, наконец, одно слово из последнего набора.

0 голосов
/ 07 января 2019

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

Нечто подобное (скорее псевдокод, чем настоящий питон):

def check(text):
  words = segment(text)
  for i in range(0, len(text)-2):
      check_word1(text[i]) and check_word1(text[i+1]) and check_word3(text[i+2])
0 голосов
/ 07 января 2019

На всякий случай, если вы не знали, вы можете использовать сайты типа https://regex101.com/, чтобы проверить свои регулярные выражения и посмотреть, почему это работает / не работает.

В этом случае вам понадобится оператор «ноль или более» (*) для вашей второй группы. Результат будет:

(Potential|Ability|Possibility|need|requires|needs|plenty|for|Needing|Requiring)[ ,]*(for|to|of|full|a|be|complete|Internal)*[ ,]*(renovate|improve|modernise|modernize|update|renovating|improving|modernising|modernizing|updating|potential|project|renovation)

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

(Potential|Ability|Possibility|need|requires|needs|plenty|for|Needing|Requiring)[ ,]*(?:(for|to|of|full|a|be|complete|Internal)[ ,]*)*(renovate|improve|modernise|modernize|update|renovating|improving|modernising|modernizing|updating|potential|project|renovation)
0 голосов
/ 07 января 2019

Набор 1: сопоставляет любое слово из набора 1 с разделителем 1.

(Potential|Ability|Possibility|need|requires|needs|plenty|for|Needing|Requiring)[ ,]

Набор 2: сопоставляет любое слово из набора 2 с разделителем 1, 0 или более раз.

((for|to|of|full|a|be|complete|Internal)[ ,])*

Набор 3: Соответствует любому из слов в наборе 3

(renovate|improve|modernise|modernize|update|renovating|improving|modernising|modernizing|updating|potential|project|renovation)

Full:

(Potential|Ability|Possibility|need|requires|needs|plenty|for|Needing|Requiring)[ ,]((for|to|of|full|a|be|complete|Internal)[ ,])*(renovate|improve|modernise|modernize|update|renovating|improving|modernising|modernizing|updating|potential|project|renovation)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...