Как использовать регулярное выражение для сопоставления, если какой-либо шаблон появляется один раз из множества в данной последовательности - PullRequest
6 голосов
/ 08 июля 2019

Трудно сказать это правильно, но TL; DR.

Я хочу сопоставить в данном текстовом предложении (скажем, «ДЕРЕВО ЗЕЛЕНАЯ»), если любой пробел удвоен (или больше).

Пример:

"In this text,
THE TREE IS GREEN should not match,
THE  TREE IS GREEN should
and so should THE  TREE   IS GREEN
but  double-spaced  TEXT  SHOULD  NOT BE  FLAGGED outside the pattern."

Мой первоначальный подход был бы

/THE( {2,})TREE( {2,})IS( {2,})GREEN/

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

Ответы [ 4 ]

4 голосов
/ 08 июля 2019

Вы можете использовать Negative lookahead, если есть возможность.

Сначала сопоставьте предложение, которое вы хотите потерпеть неудачу, в вашем случае это «ДЕРЕВО ЗЕЛЕНОЕ», а затем приведите наиболее общий случай, который хочет получить желаемый результат.

(?!THE TREE IS GREEN)(THE[ ]+TREE[ ]+IS[ ]+GREEN)

https://regex101.com/r/EYDU6g/2

2 голосов
/ 08 июля 2019

Вы можете просто искать места, которые вы ищете:

/ {2,}/ будет соответствовать двум или более пробелам. (https://regexr.com/4h4d4)

Вы можете получить результаты, заключив их в круглые скобки - /( {2,})/

Возможно, вы захотите немного его расширить.
/\s{2,}/ будет соответствовать любому удвоению пробела. (\ s - означает любой пробел - пробел, табуляция, перевод строки и т. д.)

Нет необходимости сопоставлять всю строку, только интересующую ее часть.

1 голос
/ 08 июля 2019

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

Если это так, вы можете использовать:

^.*[A-Z]+ {2,}[A-Z]+.*$
  • ^ Начало строки
  • .*[A-Z]+ соответствует любому символу, кроме новой строки 0+, затем соответствует 1+ раз [A-Z]
  • [ ]{2,} Совпадение 2 или более раз через пробел (для ясности используются квадратные скобки)
  • A-Z+ Совпадение 1+ с заглавными буквами
  • .*$ Соответствует любому символу, кроме новой строки 0+ раз до конца строки

Regex demo

0 голосов
/ 09 июля 2019

Вы можете сделать это:

import re

pattern = r"THE +TREE +IS +GREEN"

test_str = ("In this text,\n"
    "THE TREE IS GREEN should not match,\n"
    "THE  TREE IS GREEN should\n"
    "and so should THE TREE   IS GREEN\n"
    "but  double-spaced  TEXT  SHOULD  NOT BE  FLAGGED outside the pattern.")

matches = re.finditer(pattern, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):
    if match.group() != 'THE TREE IS GREEN':
        print ("{match}".format(match = match.group()))
...