#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)
и$
в том порядке, в котором вы хотите, это ничего не меняет.