Совпадать с регулярным выражением только в одной строке - PullRequest
1 голос
/ 25 февраля 2020

Пример текста, который я пытаюсь решить с помощью регулярного выражения в Python, выглядит следующим образом

it is amamzing to look at the evening sky and the color<br/>
color of the sky is blue<br/>
color<br/>
sky color is blue

Я пытаюсь найти до 3 слов, предшествующих цвету однако я хочу извлечь слова, если они находятся только в одной строке

Выделен вывод, который ищется

it is amamzing to look at the evening <b>sky and the</b> color<br/>
color of the sky is blue<br/>
color<br/>
<b>sky</b> color is blue

Код, который я использую:

((?:\S+\s+){0,4}\b(?=color)\b\s*)

Пример как показано ниже

https://regex101.com/r/Q61Hi7/1

Это может быть повторяющийся вопрос, однако я не смог найти ответ, который решает

Ответы [ 4 ]

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

Вы можете использовать

\S+(?:[^\S\r\n]+\S+){0,3}(?=[^\S\r\n]+color\b)

См. Демо regex и график Regulex :

enter image description here

Подробности

  • \S+ - 1+ непробельных символов
  • (?:[^\S\r\n]+\S+){0,3} - от нуля до трех вхождений
    • [^\S\r\n]+ - 1+ горизонтальных пробелов (при условии, что окончания строк CR / LF)
    • \S+ - 1+ непробельных символов
  • (?=[^\S\r\n]+color\b) - непосредственно справа от текущего местоположения, должно быть 1+ горизонтальных пробелов и затем целое слово color.

Python демо :

import re
rx = r"\S+(?:[^\S\r\n]+\S+){0,3}(?=[^\S\r\n]+color\b)"
s = "it is amamzing to look at the evening sky and the color\ncolor of the sky is blue\ncolor\nsky color is blue"
print(re.findall(rx, s))
# => ['evening sky and the', 'sky']
1 голос
/ 25 февраля 2020
  • \n включено в \s, поэтому вы читаете из разных строк, вы можете использовать \t (пробел + табуляция)
  • до 3 слов, я бы скажем {1,3}, чтобы получить 1, 2 или 3 слова ({0,4} может читать ни одного, и 4 слова тоже)

Результат ((?:\S+[ \t]){1,3}\b(?=color)\b\s*) https://regex101.com/r/Q61Hi7/3

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

Попробуйте (?:\S+ +){0,3}color

Объяснение:

(?:...) - группа без захвата

\S+ - соответствует 1+ непробельных символов (для соответствия слово)

+ - совпадать с 1+ пробелами (здесь вы можете включить другие белые символы, но не используйте \s, так как это нарушит ваше требование совпадения с одной строкой, поскольку оно соответствует символу новой строки как хорошо)

{0,3} - соответствует предыдущему шаблону от 0 до 3 раз

color - соответствует color буквально

Демо

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

Вместо использования \s для сопоставления с любым пробелом используйте буквальный пробел для сопоставления пробелов. Вы можете добавить \t, если хотите включить это тоже.

((?:\S+ ){0,4}\b(?=color)\b\s*)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...