исключая символы в \ S регулярных выражениях - PullRequest
1 голос
/ 15 ноября 2008

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

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

это вроде работает. За исключением не совсем. Потому что он захватывает все после

РЕДАКТИРОВАТЬ: Это позволило бы получить только до кавычек, а не все после

Ответы [ 6 ]

4 голосов
/ 15 ноября 2008

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

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

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

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

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

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

1 голос
/ 15 ноября 2008

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

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

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

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

1 голос
/ 15 ноября 2008
>>> 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 "|")
1 голос
/ 15 ноября 2008

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

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

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

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

0 голосов
/ 01 февраля 2009

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

http://msn.foxsports.com/mlb/story/9152594/Fehr:'Heightened'-concern-about-free-agent-market

/ <а \ s + HREF \ s * = \ с * [ "'] (HTTP: //.*) ["'] [> \ s] / я

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

0 голосов
/ 15 ноября 2008

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

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

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

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

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

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

Это различает "

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