排除\ S正则表达式匹配中的字符

时间:2008-11-15 04:56:54

标签: python html regex

我有以下正则表达式来匹配html链接:

<a\s*href=['|"](http:\/\/(.*?)\S['|"]>
它有点工作。除了不是真的。因为它在&lt;之后抓住了所有东西。一个人... 并继续前进。我想从最后的\ S匹配中排除引号字符。有没有办法做到这一点?

编辑:这会让它只抓取报价,而不是&lt;&lt; a href btw

6 个答案:

答案 0 :(得分:4)

我不认为你的正则表达式正在做你想要的。

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

这可以非常贪婪地从http://捕获任何引号,单引号或管道之前的第一个非空格字符。就此而言,我不确定它是如何解析的,因为它似乎没有足够的密切关注。

如果你想捕捉href,你可以尝试这样的事情:

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

这使用。*? (非贪婪匹配任何东西)以允许其他属性(目标,标题等)。它匹配以单引号或双引号开头和结尾的href(它不区分,并允许href用一个打开并与另一个关闭)。

答案 1 :(得分:1)

为什么要尝试将HTML链接与正则表达式匹配?

根据你想要做的事情,适当的事情会有所不同。

您可以尝试使用HTML Parser。有几个可用,Python库中甚至有一个:https://docs.python.org/library/htmlparser.html

希望这有帮助!

答案 2 :(得分:1)

>>> 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 "|")

答案 3 :(得分:1)

\ S匹配任何不是空白字符的字符,就像[^ \ s]

一样

这样写,您可以轻松地排除引号:[^ \ s“']

请注意,您可能需要提供。*?在你的正则表达式相同的治疗方法。该点匹配任何不是换行符的字符,就像[^ \ r \ n]

一样

再次,这样写,您可以轻松地排除引号:[^ \ r \ n'“]

答案 4 :(得分:0)

阅读Jeff Friedl的“掌握正则表达式”一书。

正如所写:

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

表达式中有不平衡的括号。也许麻烦的是第一场比赛被视为“读到正则表达式结束”。另外,为什么你不想要URL的最后一个非空格字符?

。*? (懒惰的贪心)操作员很有意思。不过,我必须说,我更倾向于写作:

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

这区分“&lt; ahref”(不存在的HTML标记)和“&lt; a href”(有效的HTML标记)。它不捕获'http://'前缀。我不确定你是否必须逃避斜线 - 在Perl,我主要工作,我不需要。捕获部分使用贪婪匹配,但仅限于可能半合法地出现在URL中的字符。具体来说,它不包括引号和结束标记(并且,对于好的衡量标准,也包括开始标记)。如果你真的想要'http://'前缀,请适当地移动捕获括号。

答案 5 :(得分:0)

我在福克斯体育的一些网址中遇到过单引号问题。我做了一些轻微的调整,我认为应该照顾它。

http://msn.foxsports.com/mlb/story/9152594/Fehr:'Heightened'-关注-约 - 自由剂市场

/&LT;一个\ s + HREF \ S * = \ S * [ “'](HTTP://.*)[”'] [&GT; \ S] / I

这要求结束引号后跟空格或右括号。