Исключая символы в совпадении регулярного выражения \ S

У меня есть следующее выражение регулярного выражения для соответствия html-ссылкам:

<a\s*href=['|"](http://(.*?)\S['|"]>

это вроде работает. За исключением того, что на самом деле. Потому что он захватывает все, что находится после <a href ... и просто продолжает идти. Я хочу исключить символы кавычек из последнего совпадения \ S. Есть ли способ сделать это?

Обновлено: Это заставит его захватить только кавычки, а не все после <a href btw

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

user3850 15.11.2008 08:09

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

user3850 15.11.2008 08:18

Это не работает: кавычки должны совпадать. Атрибут с одинарной кавычкой в ​​качестве разделителя может содержит двойные кавычки. Кроме того, вы не обслуживаете другие атрибуты (например, «title»), относительные пути или другие протоколы, кроме http.

bart 15.11.2008 12:27

У вас в регулярном выражении несбалансированные круглые скобки - оно компилируется? И вам нужно использовать обратную ссылку '\ 1', чтобы получить соответствующую цитату?

Jonathan Leffler 15.11.2008 19:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
6 197
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Почему вы пытаетесь сопоставить HTML-ссылки с регулярным выражением?

В зависимости от того, что вы пытаетесь сделать, подходящие действия будут отличаться.

Вы можете попробовать использовать HTML-парсер. Доступно несколько, есть даже один в библиотеке Python: https://docs.python.org/library/htmlparser.html

Надеюсь это поможет!

>>> import re
>>> regex = '<a\s+href=["\'](http://(.*?))["\']>'
>>> string = '<a href = "http://google.com/test/this">'
>>> match = re.search(regex, string)
>>> match.group(1)
'http://google.com/test/this'
>>> match.group(2)
'google.com/test/this'

объяснения:

 \s+   = match at least one white space (<ahref) is a bad link
 ["\'] = character class, | has no meaning within square brackets
         (it will match a literal pipe "|")
Ответ принят как подходящий

Я не думаю, что ваше регулярное выражение делает то, что вы хотите.

<a\s*href=['|"](http://(.*?)\S['|"]>

Это захватывает все, что угодно, от http: // до первого непробельного символа перед кавычкой, одинарной кавычкой или вертикальной чертой. В этом отношении я не уверен, как он разбирается, поскольку, похоже, у него недостаточно близких пар.

Если вы пытаетесь захватить href, вы можете попробовать что-то вроде этого:

<a .*?+href=['"](http://.*?)['"].*?>

Здесь используется расширение. *? (нежадное сопоставление с чем-либо), чтобы разрешить другие атрибуты (цель, заголовок и т. д.). Он соответствует href, который начинается и заканчивается одинарной или двойной кавычкой (он не различает и позволяет href открываться одной и закрывать другой).

Все отображаемые регулярные выражения соответствуют несоответствующим одинарным / двойным кавычкам (как в вопросе, так и в ответе). Вам нужно будет захватить открытую цитату и снова использовать ее в обратной ссылке \ 1.

Jonathan Leffler 09.12.2008 21:21

\ S соответствует любому символу, не являющемуся пробелом, как и [^ \ s]

Написано так, вы можете легко исключить кавычки: [^ \ s "']

Обратите внимание, что вам, скорее всего, придется указать. *? в вашем регулярном выражении такое же лечение. Точка соответствует любому символу, кроме символа новой строки, как и [^ \ r \ n]

Опять же, написав так, вы можете легко исключить кавычки: [^ \ r \ n '"]

Прочтите книгу Джеффа Фридла «Освоение регулярных выражений».

Как написано:

<a\s*href=['|"](http://(.*?)\S['|"]>

У вас в выражении несбалансированные круглые скобки. Может быть, проблема в том, что первое совпадение обрабатывается как «прочитанное до конца регулярного выражения». Кроме того, почему бы вам не нужен последний непробельный символ URL-адреса?

. *? (ленивый жадный) оператор интересен. Однако должен сказать, что я был бы более склонен написать:

<a\s+href=['|"]http://([^'"><]+)\1>

Это различает "<ahref" (несуществующий тег HTML) и "<a href" (действительный тег HTML). Он не записывает префикс http: //. Я не уверен, нужно ли вам избегать косых черт - в Perl, где я в основном работаю, мне это не нужно. Захватывающая часть использует жадное совпадение, но только для символов, которые могут полузаконно появляться в URL-адресе. В частности, он исключает как кавычки, так и конечный тег (а также, для хорошей оценки, начальный тег). Если вам действительно нужен префикс http: //, сдвиньте скобку захвата соответствующим образом.

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

http://msn.foxsports.com/mlb/story/9152594/Fehr: "Повышенная" обеспокоенность по поводу рынка свободных агентов

/<a\s+href\s*=\s*["'**************#

это требует, чтобы за закрывающей кавычкой следовала пробел или закрывающая скобка.

Другие вопросы по теме