如何在没有匹配模式本身的情况下在正则表达式中查看?

时间:2017-10-15 10:20:12

标签: python regex

让我们说我们想要在这样的标签中提取链接:

输入:

<p><a href="http://www.google.com/home/etc"><b>some text</b></a></p>

期望的输出:

http://www.google.com/home/etc

第一个解决方案是使用此href=[\'"]?([^\'" >]+)正则表达式查找与引用的匹配项  但我想要实现的是匹配href之后的链接。所以尝试这个(?=href\")...(前瞻性断言:没有消费的匹配)仍然匹配href本身。

这是一个只有正则表达式的问题。

3 个答案:

答案 0 :(得分:2)

许多基于正则表达式的解决方案中的一个是捕获组:

>>> re.search(r'href="([^"]*)"', s).group(1)
'http://www.google.com/home/etc'

[^"]*匹配任何非 - “。

答案 1 :(得分:1)

解决方案可能是:

(?:href=)('|")(.*)\1

(?:href=)是一个非捕获组。这意味着解析器在匹配期间使用href,但它实际上不返回它。事实上,如果你在regex中尝试这样做,你会看到没有任何团体持有它。

此外,每次打开和关闭圆括号时,都会创建一个组。因此,('|")定义了组#1,您想要的URL将在组#2中。检索此信息的方式取决于编程语言。

最后,\1返回组#1保留的值(在这种情况下,它将是"),以便为URL提供分隔符

答案 2 :(得分:0)

让自己熟悉解析器,例如与BeautifulSoup 有了这个,就可以用

来实现
from bs4 import BeautifulSoup

html = """<p><a href="http://www.google.com/home/etc"><b>some text</b></a></p>"""

soup = BeautifulSoup(html, "html5lib")
print(soup.find('a').text)
# some text

BeautifulSoup支持多种选择器,包括CSS selectors