2013-03-18 3 views
0

Я пытаюсь заставить регулярное выражение работать там, где оно соответствует определенному шаблону, если оно не выполняется другим. Например,Отрицание соответствия, если строка перед другой строкой

Accessory for MyProduct01 <<< Should be classified as an accessory 
MyProduct01 with accessory << Should be classified as a product 

Так что мне нужно что-то добавить к моему «аксессуар» регулярное выражение, что-то вроде "матч„аксессуар“так долго, как слово, прежде чем не„с“.

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

(?!with\s)accessory 
+0

Это не отрицательный lookbehind; это негативный взгляд __ahead__ :) –

+1

Точно: Я думаю, что вы хотите (? Bristol

ответ

2

Просто используйте отрицательный взгляд, отстает в своем регулярном выражении:

(?<!with\s)accessory 
+0

Это сработало даже на python. Однако я допустил ошибку, что на самом деле я использую поиск не в соответствии, хотя я не уверен ((? alj

+0

Это регулярное выражение может использоваться как для поиска, так и для поиска (мы не можем использовать '*' или '+' и т. д.). – Bohemian

+0

Btw регулярное выражение в вашем комментарии не имеет смысла: ORed look-behind выражение * всегда * true! Только два, как этот '(? Bohemian

0

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

^(?!\bwith\b.*\baccessory\b)(?=.*\b(accessory)\b) 

Здесь отрицательный lookahead используется для обеспечения того, чтобы «аксессуар» не появился после слова «с». Затем положительный lookahead используется, чтобы гарантировать, что слово «аксессуар» встречается внутри строки, захваченной группой, если вам нужно ее захватить по какой-то причине.

Основываясь на том, как я написал выше, вы бы хотели использовать метод search, а не метод match. Для того, чтобы использовать match, который требует, чтобы вся строка поиска соответствует шаблону, вам нужно добавить немного больше к схеме:

^(?!\bwith\b.*\baccessory\b)(?=.*\b(accessory)\b).*$ 
Смежные вопросы