У меня есть следующее выражение регулярного выражения для соответствия html-ссылкам:
<a\s*href=['|"](http://(.*?)\S['|"]>
это вроде работает. За исключением того, что на самом деле. Потому что он захватывает все, что находится после <a href ... и просто продолжает идти. Я хочу исключить символы кавычек из последнего совпадения \ S. Есть ли способ сделать это?
Обновлено: Это заставит его захватить только кавычки, а не все после <a href btw
кстати, это регулярное выражение даже не компилируется: несбалансированные паренсы
Это не работает: кавычки должны совпадать. Атрибут с одинарной кавычкой в качестве разделителя может содержит двойные кавычки. Кроме того, вы не обслуживаете другие атрибуты (например, «title»), относительные пути или другие протоколы, кроме http.
У вас в регулярном выражении несбалансированные круглые скобки - оно компилируется? И вам нужно использовать обратную ссылку '\ 1', чтобы получить соответствующую цитату?






Почему вы пытаетесь сопоставить 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.
\ 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*["'**************#
это требует, чтобы за закрывающей кавычкой следовала пробел или закрывающая скобка.
было бы полезно узнать, чего он на самом деле пытается достичь ...