我试图弄清楚如何在 Python 中使用正则表达式来提取字符串中的某些 URL。例如,我可能有 'blahblahblah (a href="example.com")'。在这种情况下,我想提取所有“example.com”链接。我怎样才能做到这一点,而不是仅仅拆分字符串?
谢谢!
有一个很棒的模块,叫做 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/
不要使用正则表达式:
这就是为什么在处理 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'
正则表达式是非常强大的工具,但它们可能并非在所有情况下都是您的工具(正如其他人已经建议的那样)。也就是说,这是控制台中的一个最小示例,它根据请求使用正则表达式:
>>> 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="
,然后将结果保存为任何字符,直到您点击下一个"
。语法是:
()
“只在这里保存东西”.
“任何字符”*
“任意次数”?
“非贪婪”或其他术语:找到满足要求的最短字符串(尝试不带问号,你会看到会发生什么)。!