Вопрос или проблема
Например:
что-то 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+
Объяснение выражения:
\b
– Это граница слова. Она помогает гарантировать, что мы начинаем сопоставление с начала слова.(?<!>)
– Это негативный просмотр назад (negative lookbehind), который проверяет, что предшествующий символ не является ‘>’. Если ‘>’ встречается перед искомым словом, данное выражение не даст совпадения.\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']
.
Таким образом, это решение позволяет находить слова в строке, игнорируя те, которые предшествуют символу ‘>’, и соответствует требованиям, указанным в вашей задаче.
Если у вас возникли дополнительные вопросы, пожалуйста, не стесняйтесь их задавать!