python正则表达式(re使用)

python正则表达式(re模块)

  跟之前在js中所见到的正则表达式是类似的

一:re的常用操作符:

操作符说明实例
. 表示单个字符  
[ ] 字符集,对单个字符给出取值范围 [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,\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中就好了

 

 

posted @ 2020-10-04 12:07  焕不涣  阅读(698)  评论(0编辑  收藏  举报