0

我试图弄清楚如何在 Python 中使用正则表达式来提取字符串中的某些 URL。例如,我可能有 'blahblahblah (a href="example.com")'。在这种情况下,我想提取所有“example.com”链接。我怎样才能做到这一点,而不是仅仅拆分字符串?

谢谢!

4

3 回答 3

1

有一个很棒的模块,叫做 BeautifulSoup(链接:http ://www.crummy.com/software/BeautifulSoup/ ),它非常适合解析 HTML。您应该使用它而不是使用正则表达式从 HTML 获取信息。这是 BeautifulSoup 的示例:

>>> from bs4 import BeautifulSoup
>>> html = """<p> some <a href="http://link.com">HTML</a> and <a href="http://second.com">another link</a></p>"""
>>> soup = BeautifulSoup(html)
>>> mylist = soup.find_all('a')
>>> for link in mylist:
...    print link['href']
http://link.com
http://second.com

这是文档的链接,非常容易理解:http ://www.crummy.com/software/BeautifulSoup/bs4/doc/

于 2013-01-23T01:04:00.563 回答
0

不要使用正则表达式:

这就是为什么在处理 HTML 或 XML(或 URL)时不应该首先考虑正则表达式的原因。

如果您仍然想使用正则表达式,

您可以找到几种可以完成这项工作的模式,以及几种获取您希望找到的字符串的方法。

这些模式可以完成工作:

r'\(a href="(.*?)"\)'

r'\(a href="(.*)"\)'

r'\(a href="(+*)"\)'

1. re.findall()

re.findall(pattern, string, flags=0) 

返回字符串中模式的所有非重叠匹配,作为字符串列表。从左到右扫描字符串,并按找到的顺序返回匹配项。如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。空匹配包含在结果中,除非它们触及另一个匹配的开始。

import re
st = 'blahblahblah (a href="example.com") another bla <a href="polymer.edu">'
re.findall(r'\(a href="(+*)"\)',s)

2. re.search()

re.search(pattern, string, flags=0)

扫描字符串以查找正则表达式模式产生匹配的位置,并返回相应的 MatchObject 实例。

然后,re.group()通过小组进行。例如,使用 regex r'\(a href="(.+?(.).+?)"\)',也可以在这里工作,你有几个封闭的组:组 0 匹配整个模式,组 1 匹配用括号括起来的第一个封闭子模式,(.+?(.).+?)

仅在查找第一次出现的模式时使用搜索。以你的例子,这将是

>>> st = 'blahblahblah (a href="example.com") another bla (a href="polymer.edu")'
>>> m=re.search(r'\(a href="(.+?(.).+?)"\)', st)
>>> m.group(1)
'example.com'
于 2013-01-24T20:44:50.850 回答
0

正则表达式是非常强大的工具,但它们可能并非在所有情况下都是您的工具(正如其他人已经建议的那样)。也就是说,这是控制台中的一个最小示例,它根据请求使用正则表达式:

>>> import re
>>> s = 'blahblahblah (a href="example.com") another bla <a href="subdomain.example2.net">'
>>> re.findall(r'a href="(.*?)"', s)
['example.com', 'subdomain.example2.net']

专注于r'a href="(.*?)"'。在英语中,它翻译为:“找到一个以 开头的字符串a href=",然后将结果保存为任何字符,直到您点击下一个"。语法是:

  • 意思是()“只在这里保存东西”
  • 意思是.“任何字符”
  • 意思是*“任意次数”
  • 意思是?“非贪婪”或其他术语:找到满足要求的最短字符串(尝试不带问号,你会看到会发生什么)。

于 2013-01-23T01:33:14.870 回答