Почему это регулярное выражение не работает?

#python #regex

#python #регулярное выражение

Вопрос:

Я хочу отделить ссылки от строки, которые не имеют ‘:’ между ними и не заканчиваются на ‘.jpg’ или ‘.svg’, а также начинаются с ‘/wiki/’.

Так что это неправильно —

 "https://boomerrang.com"
"/wiki/sbsbs:kjanw"
"/wiki/aswaa:asawsa.jpg"
"/wiki/awssa.random.jpg"
"/wiki/boom.jpg"
  

Как должен выглядеть конечный результат —

 "/wiki/justthis"
  

Что я пробовал —

 r'^/wiki/.*[^:](?!jpg|svg)$'
  

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

Спасибо

Комментарии:

1. как должен выглядеть конечный результат?

Ответ №1:

Почему ваш шаблон не работает:

.*[^:] не препятствует : присутствию a в строке, поскольку .* может соответствовать ему.

(?!jpg|svg)$ не имеет смысла, поскольку в нем говорится, что за концом строки не следует «jpg» или «svg». Очевидно, что за концом строки ничего не следует, поскольку это конец строки. Имейте в виду, что поиск (поиск или поиск сзади), якоря типа ^ $ или граница слова b являются утверждениями нулевой ширины и не используют символы, поэтому (?!jpg|svg) и $ проверяются с той же позиции в строке.

Вы можете попробовать это:

 r'^/wiki/[^:]*(?<!.jpg)(?<!.svg)$'
  

Два отрицательных lookbehinds в конце гарантируют, что строка не заканчивается на .svg or .jpg .

[^:]* избегает любого : в строке.

Комментарии:

1. Вау, это сработало как шарм, не могли бы вы объяснить это вкратце? И действительно ли не нужно избегать косой черты, в отличие от предложения в комментариях?

2. @numpy: вы обновили текущую страницу? О чем, в частности, вам нужна дополнительная информация?

3. @numpy Я предлагаю вам вставить это регулярное выражение сюда: regex101.com и вы получите представление о том, что делает каждая вещь, и вы сможете поиграть с ней больше, чтобы лучше понять.

4. (?<!.jpg)(?<!.svg)$ just the explanation about this grouping… ‘?<‘ sequence

5. @numpy: (?<!...) отрицательный взгляд назад, это означает, что ему не предшествует . В качестве предварительного просмотра, lookbehind — это только тест, который не использует символ (это утверждение нулевой ширины). Обратите внимание, что в текущем шаблоне, который вы можете поместить (?<!.jpg) , (?<!.svg) и $ в том порядке, в котором вы хотите, это ничего не меняет.