Python RegEx: сопоставление слов в строке только если они не предшествуют определённому символу

Вопрос или проблема

Например:

что-то foo что-то-ещё // совпадает: [что-то, foo, что-то-ещё]
что-то1 что-то.foo-что-то-ещё // совпадает: [что-то1, что-то, foo, что-то-ещё]

но не если предшествует ‘>’

что-то1 что-то>foo-.что-то-ещё // совпадает: [что-то1, что-то, что-то-ещё]

Я разработал этот регулярное выражение:

(?(?<!>)(\w+)|\w+)
(? - если
 (?<! - не предшествует (отрицательный просмотр назад)
  > - литерал '>'
 )
 (\w+) - захватывает группу из 1 или более буквенных символов
 | - иначе
 \w+ - сопоставляет 1 или более буквенных символов без захвата
)

что работало в regex101 (слова, начинающиеся с >, не включались в группу 1), но тогда я узнал, что условные регулярные выражения либо не работают в Python, либо работают не так, как в Perl.

Также поправьте меня, пожалуйста, если это неверно.

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

\b(?<!>)\w+

Смотрите демонстрацию regex

Если вы хотите использовать захватывающую группу:

\b(?<!>)(\w+)|\w+

Смотрите другую демонстрацию regex

Ответ или решение

Чтобы решить задачу, связанной с использованием регулярных выражений (RegEx) в Python для поиска слов в строке с условием, что они не должны предшествоваться определенным символом (в данном случае символом ‘>’), мы можем воспользоваться негативным просмотром назад (negative lookbehind).

Решение задачи

Для выполнения данной задачи мы можем использовать следующее регулярное выражение:

\b(?<!>)\w+

Объяснение выражения:

  1. \b – Это граница слова. Она помогает гарантировать, что мы начинаем сопоставление с начала слова.
  2. (?<!>) – Это негативный просмотр назад (negative lookbehind), который проверяет, что предшествующий символ не является ‘>’. Если ‘>’ встречается перед искомым словом, данное выражение не даст совпадения.
  3. \w+ – Это класс символов, который соответствует одному или более символам слова (буквы, цифры и символ подчеркивания).

Пример использования в Python

import re

text1 = "something foo somethingelse"
text2 = "something1 something.foo-somethingelse"
text3 = "something1 something>foo-.somethingelse"

# Применяем регулярное выражение
matches1 = re.findall(r'\b(?<!>)\w+', text1)
matches2 = re.findall(r'\b(?<!>)\w+', text2)
matches3 = re.findall(r'\b(?<!>)\w+', text3)

print(matches1)  # ['something', 'foo', 'somethingelse']
print(matches2)  # ['something1', 'something', 'foo', 'somethingelse']
print(matches3)  # ['something1', 'something', 'somethingelse']

Результаты:

  • Для строки text1 получим совпадения: ['something', 'foo', 'somethingelse'].
  • Для строки text2 получения совпадений: ['something1', 'something', 'foo', 'somethingelse'].
  • Для строки text3, где слово ‘foo’ предшествуется символом ‘>’, получим: ['something1', 'something', 'somethingelse'].

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

Если у вас возникли дополнительные вопросы, пожалуйста, не стесняйтесь их задавать!

Оцените материал
Добавить комментарий

Капча загружается...