跟之前在js中所见到的正则表达式是类似的
操作符 | 说明 | 实例 |
---|---|---|
. | 表示单个字符 | |
[ ] | 字符集,对单个字符给出取值范围 | [abc]表示abc [a-z]不爱告诉a到z单个字符 |
[ ^ ] | 非字符集,对单个字符给出排除范围 | [^abc]表示非a或非b或非c的单个字符 |
* | 前一个字符0次货无限次扩展 | abc*表示ab、abc、abcc、abccc |
+ | 前一个字符1次货无限次扩展 | abc+表示abc、abcc、abccc |
? | 前一个字符0次货1次扩展 | abc?表示ab、abc |
| | 左右表达式任意一个 | abc|def表示abc、def |
{m} | 扩展前一个字符m次 | ab{2}c表示abbc |
{m,n} | 扩展前一个字符m到n次 | abP{1,2}表示abc、abbc |
^ | 匹配字符串开头 | ^abc表示abc且在一个字符串的开头 |
$ | 匹配字符串结尾 | abc$表示abc且在一个字符串的结尾 |
() | 分组标记,内部职能使用|操作符 | (abc)表示abc,(abc|def)表示abc、def |
d | 数字,等价于【0-9】 | |
w | 单词字符,等价于【A-Za-z0-9_】 |
二:re库的主要功能函数:
函数 | 说明 |
---|---|
re.search() | 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象 |
re.findall() | 搜索字符串,以列表类型返回全部能匹配的子串 |
re.match() | 从一个字符串的开始位置起匹配正则表达式,返回match对象 |
re.split() | 将一个字符串按照正则表达式匹配进行分割,返回列表类型 |
re.finditer() | 搜索字符串,返回一个匹配结果的迭代类型,每一个迭代元素是match对象 |
re.sub() | 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串 |
re库中包含的一些可选标志修饰符来控制匹配的模式
修饰 | 描述 |
---|---|
re.I | 是匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware) |
re.M | 多行匹配,映像^和$ |
re.S | 使.匹配包括换行再被的所有字符 |
re.U | 根据Unicode字符集解析字符,这个标志映像w,W,,B |
re.X | 该标志通过给予更多灵活的格式以便将正则表达式写的更易于理解 |
三:re使用格式
import re pat=re.compile("AA") #此处的AA,是正则表达式,用来验证其他字符串 m=pat.search("AABCD") #search字符串被校验的内容 #输出结果会显示查询到一个匹配的位置 #直接去进行匹配: m=re.search("asd","AAasd")#前面是规则,后面是进行匹对的对象 print(m) #使用findall匹配: print(re.findall("[A-Z]"),"asffsaOGUGFU")#输出多个单个字符 print(re.findall("[A-Z]+"),"asffsaOGUGFU")#输出多个多字符串 #sub替换 print(re,sub("a","A","abcdasd")) #找到a用A替换,在第三个字符串查找 #r(去除转义的影响),建议在正则表达式中,被比较的字符串前面加上一个r a=r"aabd-" print(a)
四:使用re逐一解析数据:
1.从源码中获取详细字符串片段:
import re findLink=re.compile(r'<a href="(.*?)">') #<img alt="肖申克的救赎" class="" src="http://img3.douban.com/view/photo/s_radio"> findImgSrc=re.compile(r'<img.*src="(.*?)"',re.S)#re.S忽略换行符 #影片片名 findTitle=re.complie(r'<spam class="title">(.*)</span>) #影片评分 findRating=,,,,,,,,,,,,,,,,,,,,,, #获取到页面数据并保存到html中 html=askURL(url) #注意解析数据: soup=BeautifulSoup(html,"html.parse") for item in soup.find_all('div',class_="item"): #找到符合要求的字符串,形成列表 data=[] #保存一部电影的所有信息 item=str(item) #获取详情信息 Link=re.findall(findLink,item)[0]#注意:这里使用findall是吧findLink中正则表达式在item中查找并将其赋值给Link
2.标签解析:(承接上面的内容)
data=[] #保存一部电影的所有信息 Link=re.findall(findLink,item)[0] data.append(Link) #如果遇到了多个数据的返回对象; title=re.findall(findTitle,item)#标题可能会有中文名和英文名 if(len(titles)==2): ctitle=titles[0] data.append(ctitle) otitle=titles[1].replace("/"."")#去掉无关符号,去掉/符号 data.append(otitle) else: data.append(titles[0]) data.append(' ')#外国名字留空 #同时也可以对用re提取到的字符串进行替换或者增删改查 bd=re.findall(findBd,item[0]) bd=re.sub('<br(s+)?/>(s+)?',"",bd) #去掉<br/> bd=re.sub('/'," ",bd)#替换/ data.append(bd.stri())#去掉前后空格之后的内容 #以上这些都是往一个data电影信息列表中加入 #想要得到多个电影信息,使用for循环,然后放到datalist中就好了