正则表达式用来定义“字符串符合规则”。本文从常用符号和示例两个方面着手分析。
A、正则表达式常用符号:
B、举例:aa*bbbbb(cc)*(d | )
第一次看这个字符串会觉得有点儿奇葩,但是当我们把它分解之后就会很清楚了。
• aa*
a 后面跟着的a*(读作a 星)表示“重复任意次a,包括0 次”。这样就可以保证字母a至少出现一次。
• bbbbb
这没有什么特别的——就是5 次b。
• (cc)*
任意偶数个字符都可以编组,这个规则是用括号两个c,然后后面跟一个星号,表示有任意次两个c(也可以是0 次)。
• (d|)
增加一个竖线(|)在表达式里表示“这个或那个”。本例是表示“增加一个后面跟着空格的d,或者只有一个空格”。这样我们可以保证字符串的结尾最多是一个后面跟着空格的d
C、举例:邮箱规则[A-Za-z0-9\._+]+@[A-Za-z]+\.(com|org|edu|net)
正则表达式和BeautifulSoup
举例:打印以../img/gifts/img 开头,以.jpg 结尾的图片的相对路径
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
html = urlopen("http://www.pythonscraping.com/pages/page3.html")
bsObj = BeautifulSoup(html)
images = bsObj.findAll("img",{"src":re.compile("\.\.\/img\/gifts/img.*\.jpg")})
for image in images:
print(image["src"])
结果如下所示:
../img/gifts/img1.jpg
../img/gifts/img2.jpg
../img/gifts/img3.jpg
../img/gifts/img4.jpg
../img/gifts/img6.jpg
另外,附上Lambda表达式,和本文主题无关,可以不看:
Lambda 表达式本质上就是一个函数,可以作为其他函数的参数使用;也就是说,一个函数不是定义成f(x, y),而是定义成f(g(x), y),或f(g(x), h(x)) 的形式。
BeautifulSoup 允许我们把特定函数类型当作findAll 函数的参数。唯一的限制条件是这些函数必须把一个标签作为参数且返回结果是布尔类型。BeautifulSoup 用这个函数来评估它遇到的每个标签对象,最后把评估结果为“真”的标签保留,把其他标签剔除。
举例:soup.findAll(lambda tag: len(tag.attrs) == 2)