正则表达式
正则表达式是对字符串操作的一种逻辑方式,就是用实现定义好的特定字符和这些特定字符的组合组成一个规则字符串,这个规则字符窜用来表达对字符窜一种过滤逻辑。
match方法
re.match(pattern,string,flags=0)
其中:
pattern是正则表达式,包含一些特殊的字符,使用者需要的字符
string为要待匹配的字符串
flags用来控制正则表达式,如区分大小写,多行匹配等
import re
m=re.match('abc','abcdefg') #pattern 为 abc
print(m) #展示匹配的结果
print(m.span()) #展示匹配的起点和终点
print(m.start())#展示匹配的起点
print(m.end()) #展示匹配的终点位置
import re
line =" daniel is a handsome boy"
m=re.match(r'(.*) a (.*?) boy',line)
print(m.group(0)) #0 相当于是输出原话
print(m.group(1)) #展示第一匹配结果
print(m.group(2)) #展示第二个匹配结果
print(m.group()) #展示整个匹配结果的列表
其中
(.)属于正则表达符号,这里的意思是匹配最多的字符。
(.?)是叫做非贪婪模式,会尽量匹配尽量少的字符。
search方法
match只能从字符串的起始位置开始匹配,而search则是扫描整个字符串并返回第一成功的匹配。
import re
m_match=m.match('efg','abcdefg')
m_search=m.search('efg','abcdefg')
print(m_match)
print(m_search)
得到的结果也是如上面文字所讲一样,match方法是无法匹配上efg的,但是search的话,就以匹配上efg.而且这里的efg是属于第一匹配的结果,如果在后面还有一样的话,是不会表示出来的,这是他们之间的不同。
findall 方法
match和search方法都只是可以找到一个匹配的结果,而findall方法的话,则可以找到所有的匹配的结果。如在爬取博客文章的标题时,如果提取的不是一个标题,而是所有的标题,就可以用findall,而且匹配的结果用一个list列表来展示。
比如下面这个例子
首次假设我们爬取到了含有标题的html文本,在里面找出所有的标题,就可以这样做:
import re
import requests
host = "www.sina.com"
r=requests.get(host) #上网
html=r.text #网页原代码变成是文本
####接下来使用正则表达式,找出自己想要的结果
title=re.findall('<h1> class='xxx'<a herf=.*?>(.*)<a></h1>',html) #前面的参数是正则表达式,而后面是待匹配的文本。
print(title) #由于title全部都是以上面的参数中的正则表达式,比如(.*),其他的内容都不会展示出来,这是值得注意的
当然利用正则表达式的话,我们可以进行多次的匹配和筛选,得到自己想要的结果。