如何指定必需的文本并将该文本显示在正则表达式匹配中?

时间:2012-02-12 20:04:31

标签: python regex

我一直在尝试制作一个简单的Python网络爬虫,我正在使用正则表达式来查找相关链接。我正在尝试的网站是一个维基,我想只找到其URL以/ wiki /开头的链接。我也可以将其扩展到网站的其他部分,因此我要求我的代码尽可能动态。

我正在使用的当前正则表达式是

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

但是,它找到的匹配项不包含/ wiki /。我不知道正则表达式的这个属性。理想情况下,因为我可以将其扩展到站点的其他部分(例如/ bio /),我希望正则表达式返回“/ wiki / [rest_of_url]”而不是简单地“/ [rest_of_url”。正则表达式

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

工作正常(它找到以/开头的URL),因为它返回“/ wiki / [rest_of_url]”,但它不能确保/ wiki出现在文本中。

我该怎么做?

谢谢,

丹尼尔莫尼兹

2 个答案:

答案 0 :(得分:2)

展开括号,使它们包含正则表达式的/wiki/部分

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

修改

re 中,括号允许您将搜索结果分解为多个部分。您告诉 re 解析器找到整个表达式,但只返回括号中的部分。您还可以使用多组括号:

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

在这种情况下,MatchObject.group()将返回整个匹配的对象。但是,如果你调用MatchObject.groups(),它将返回一个包含/wiki/的元组,以及与第二个括号内容匹配的元组。查看regex syntax上的python.org文档。

答案 1 :(得分:1)

您可以使用HTML解析器,例如lxml

from lxml import html

for element, attribute, link, pos in html.iterlinks(html_string):
    if attribute == 'href' and link.startswith('/wiki'):
       print(link)

或使用BeautifulSoup

import re
from BeautifulSoup import BeautifulSoup

soup = BeautifulSoup(html_string)
for a in soup.findAll('a', href=re.compile(r'^/wiki')):
    print(a['href'])