Python регулярное выражение, чтобы исключить несколько слов - PullRequest
0 голосов
/ 14 апреля 2020

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

Поэтому я пробовал разные версии с упомянутыми словами и символом |. Как:

urls = re.findall(rf'^{download_artist}uploads/|{download_artist}^favorites/|^{download_artist}followers/|^{download_artist}listens/|{download_artist}\S+"', response.text, re.IGNORECASE)

или:

urls = re.findall(rf'{download_artist}^uploads/|^favorites/|^followers/|^listens/|\S+"', response.text, re.IGNORECASE)

Но он игнорирует мой ^ за исключение слов. Где моя ошибка?

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Вам нужно использовать «lookaround» в этом случае, более подробную информацию можно найти в https://www.regular-expressions.info/lookaround.html.

Итак, я думаю, что это регулярное выражение решит вашу проблему:

{download_artist}(?!uploads/|favorites/|followers/|listens/)\S+\"

Вы можете проверить, работает ли регулярное выражение в https://regex101.com/. Этот сайт очень полезен при работе с регулярными выражениями.

0 голосов
/ 14 апреля 2020

^ работает только как отрицание в символьных классах внутри [], снаружи это представляет начало ввода.

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

Это позволит сделать регулярные выражения простыми и удобочитаемыми.

Если вам придется выполнить это в одном регулярном выражении по любой причине, которую вы можете попытаться решить это с (отрицательным) внешним направлением (см. https://www.rexegg.com/regex-lookarounds.html).

...