Regex: сопоставлять URL-адреса для определенного домена, КРОМЕ, если определенный параметр строки запроса имеет определенное значение - PullRequest
1 голос
/ 21 октября 2009

Короче говоря, мне нужно сопоставить все URL-адреса в текстовом блоке, которые относятся к определенному домену и не содержат определенного параметра и значения строки запроса (см. = Twitter)

У меня есть следующее регулярное выражение для сопоставления всех URL-адресов домена.

\b(https?://)?([a-z0-9-]+\.)*example\.com(/[^\s]*)?

Я просто не могу заставить работать последнюю часть

(?![&?]refer=twitter)\b(https?://)?([a-z0-9-]+\.)*example\.com(/[^\s]*)?

Так что следующее ДОЛЖНО совпадать

example.com
http://example.com/
https://www.example.com#link
www.example.com?somevalue=foo

Но это НЕ должно

https://www.anotherexample.com#link
www.example.com?refer=twitter

EDIT: И если вы можете получить его, чтобы соответствовать

http://example.com?foo=foo.bar 

из предложения типа

For examples go to http://example.com?foo=foo.bar.

без учета периода, это было бы здорово!

EDIT2: Исправлена ​​проблема трейлинг-периода с этим

\b(https?://)?([a-z0-9-]+\.)*example\.com/?([^\s]*[^.])?

EDIT3: Кажется, это работает, или, по крайней мере, 99% тестов, которые я провел,

(?!\b.*[&?]refer=twitter)\b(https?://)?([a-z0-9-]+\.)*example\.com/?([^\s]*[^.])?

EDIT4: Поселено

\b(?!.*[&?]refer=twitter)(https?://)?([a-z0-9-]+\.)*nygard\.com(?!\.)[^\s]*\b+

Ответы [ 2 ]

1 голос
/ 22 октября 2009
(?!\b.*[&?]refer=twitter)

Это то, что вы ищете.

0 голосов
/ 22 октября 2009

Честно говоря, поначалу мысль об использовании регулярного выражения даже не приходила мне в голову (что является хорошим знаком - использование регулярного выражения, IMO, всегда должно быть второстепенным, а не первичным). Вот как я это сделаю на своем языке

>>> from urlparse import urlparse, parse_qs
>>> p = urlparse(r'http://foo.bar.com/baz?refer=twitter&rock=paper')
>>> parse_qs(p.query)
{'rock': ['paper'], 'refer': ['twitter']}

Вы можете сделать что-нибудь отсюда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...