有什么用重新编译在美丽的人群里?

2024-06-16 11:36:06 发布

您现在位置:Python中文网/ 问答频道 /正文

根据Ryan Mitchell的《用Python进行网络抓取》一书, 他用过重新编译. 有人能解释一下它的用途吗重新编译()在这种情况下重新编译()

代码是用python3编写的

from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
pages = set()
def getLinks(pageUrl):
    global pages
    html = urlopen("http://en.wikipedia.org"+pageUrl)
    bsObj = BeautifulSoup(html)
    for link in bsObj.findAll("a", href=re.compile("^(/wiki/)")):
        if 'href' in link.attrs:
            if link.attrs['href'] not in pages:
                #We have encountered a new page
                newPage = link.attrs['href']
                print(newPage)
                pages.add(newPage)
                getLinks(newPage)
getLinks("")

Tags: infromimportrehtmllinkpagesattrs
3条回答

在重新编译()将正则表达式编译为正则表达式对象

例如

line = re.compile("line")
print(line)

结果:re.compile("line")

以下是一些有关regex的好参考: 1python 3 re library 2python re.compile

这将创建一个regex对象,beauthoulsoup的findAll方法检查您传递的是已编译的regex还是仅传递一个字符串-这样就避免了不必要的计算,并且可以使用简单的字符串比较。(Regex是相当占用cpu的操作)。在

在本例中,它被用于href属性以查找<a>标记的href属性内的任何位置/wiki/,否则只需传递一个字符串,它就必须匹配整个href属性。在

另一个使用它的例子是在第一个标记参数上,以regex '^t[dh]$'为例,您可以使用它来查找td或{}标记。如果刚刚传递了一个regex字符串,它将查找<^t[dh]$>标记。在

{a1}

一般来说你为什么要用重新编译在

正如其他答案所说,这“编译”一个正则表达式,直到你调用re.match你的正则表达式只是一个字符串,re必须先转换它才能使用它,如果你传递一个字符串,它就会这样做,但这需要一些cpu时间。在

如果您要多次使用正则表达式,例如在循环中,那么每次转换将比只使用一次时占用更多的cpu,因此在循环之前执行并重新使用将使您的速度更快。在

实际上,re实际上是在幕后为您执行此操作,并“缓存”转换的对象,但这本身将增加少量的工作,因此可能仍需要比手动操作更长的时间。在

该语句在href与在re.compile中编译的正则表达式匹配的位置查找定位点。 (如果您需要了解有关regex的更多信息,请转到here

相关问题 更多 >