re模块

import re
1.findall
import re
ret=re.findall("\d+","123456sdfasdgfd789")
print(ret)
结果:['123456', '789']

参数 返回值类型:列表 返回值个数:2 返回值内容:所有匹配上的项
import re
ret=re.findall("\s","123456sdfasdgfd789")
print(ret)
结果:[]

2.search

 

import re
ret=re.search("\d+","123456sdfasdgfd789")
print(ret)
结果:<re.Match object; span=(0, 6), match='123456'>

 

返回值类型: 正则匹配结果的对象  返回值个数:1 如果匹配上了就返回对象
import re
ret=re.search("\d+","123456sdfasdgfd789")
print(ret.group())
结果:123456
返回的对象通过group来获取匹配到的第一个结果
import re
ret=re.search("\s+","123456sdfasdgfd789")
print(ret)
结果:None
返回值类型: None   如果没有匹配上就是None

 

3.match
import re
ret=re.match("\d+","123456sdfasdgfd789")
print(ret)
结果:<re.Match object; span=(0, 6), match='123456'>

import re
ret=re.match("\d+","123456sdfasdgfd789")
print(ret.group())
结果:123456
对比看,search和match的功能一样,但是也有不一样的时候
import re
ret=re.search("\d+","#$%^&*123456sdfasdgfd789")
print(ret)
ret=re.match("\d+","#$%^&*123456sdfasdgfd789")
print(ret)
结果:
<re.Match object; span=(6, 12), match='123456'>
None
4.sub替换
replace
print("replace789,2afseeeefgeesfs".replace("e","HH"))
结果:rHHplacHH789,2afsHHHHHHHHfgHHHHsfs

print("replace789,2afseeeefgeesfs".replace("e","HH",3))
结果:rHHplacHH789,2afsHHeeefgeesfs

sub替换
import re
ret=re.sub("\d+","HH","replace789,2afseeeefgeesfs")
print(ret)
结果:replaceHH,HHafseeeefgeesfs

import re
ret=re.sub("\d+","HH","replace789,2afseeeefgeesfs",1)
print(ret)
结果:replaceHH,2afseeeefgeesfs

5.subn

 

import re
ret=re.subn("\d+","HH","replace789,2afseeeefgeesfs")
print(ret)
结果:('replaceHH,HHafseeeefgeesfs', 2)

 

6.split

 

import re
ret=re.split("\d+",'小明18小红25小李32')
print(ret)
结果:['小明', '小红', '小李', '']

 

7.comple      #时间效率

 

import re
ret=re.compile("-?\d+(\.\d*)")
res=ret.search("54.2fvdsfas5633656-5213sf5")
print(res)
print(res.group())
结果:
<re.Match object; span=(0, 4), match='54.2'>
54.2

 

节省时间 : 只有在多次使用某一个相同的正则表达式的时候,这个compile才会帮助我们提高程序的效率

 

 

8.finditer  #空间效率

 

import re
ret=re.finditer("\d","asfsjgs552dfs df663adaf8sf")
print(ret)
for i in ret:
    print(i)
结果:
<re.Match object; span=(7, 8), match='5'>
<re.Match object; span=(8, 9), match='5'>
<re.Match object; span=(9, 10), match='2'>
<re.Match object; span=(16, 17), match='6'>
<re.Match object; span=(17, 18), match='6'>
<re.Match object; span=(18, 19), match='3'>
<re.Match object; span=(23, 24), match='8'>
    print(i.group())
结果:
5
5
2
6
6
3
8

 

python中的正则表达式
1 findall 会优先显示分组中的内容,要想取消分组优先,(?:正则表达式)
2 split 遇到分组 会保留分组内被切掉的内容
3 search 如果search中有分组的话,通过group(n)就能够拿到group中的匹配的内容

分组----findall
import re
ret=re.findall("www.baidu.com|www.xinlang.com","www.xinlang.com")
print(ret)
结果:['www.xinlang.com']

import re
ret=re.findall("www.(baidu|xinlang).com","www.xinlang.com")
print(ret)
结果:['xinlang']

import re
ret=re.findall("www.(?:baidu|xinlang).com","www.xinlang.com")
print(ret)
结果:['www.xinlang.com']

import re
ret = re.findall('-0\.\d+|-[1-9]\d*(\.\d+)?','-100aass-0.23ddxx-200')
print(ret)
结果:['', '', '']

import re
ret = re.findall('-0\.\d+|-[1-9]\d*(?:\.\d+)?','-100aass-0.23ddxx-200')
print(ret)
结果:['-100', '-0.23', '-200']

分组-----split

 

import re
ret=re.split("\d+","小明12小红13小李14")
print(ret)
结果:['小明', '小红', '小李', '']

import re
ret=re.split("(\d+)","小明12小红13小李14")
print(ret)
结果:['小明', '12', '小红', '13', '小李', '14', '']

 

分组-----search

 

import re
ret=re.search("\d+(\.\d+)(\.\d+)(\.\d+)?","1.2.3.4.5.6.7.899998885")
print(ret.group())
print(ret.group(0))
print(ret.group(1))
print(ret.group(2))
print(ret.group(3))
结果:
1.2.3.4
1.2.3.4
.2
.3
.4

分组练习

1匹配所有的整数
import re
ret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))")
print(ret)
结果:['1', '2', '60', '40', '35', '5', '4', '3']

由结果知道40.35分隔开了
import re
ret=re.findall(r"\d+(?:\.\d+)|(\d+)","1-2*(60+(-40.35/5)-(-4*3))")
ret.remove("")
print(ret)
结果:['1', '2', '60', '5', '4', '3']

2从类似 <a>wahaha<\a>匹配出wahaha 匹配出 a
import re
ret=re.findall(">(\w+)<",r"<a>wahaha<\a>")
print(ret)
结果:['wahaha']

import re
ret=re.findall("<(\w+)>",r'<a>wahaha<\a>')
print(ret)
结果:['a']

import re
ret=re.search(r"<(\w+)>(\w+)</(\w+)>",r"<a>wahaha</b>")
print(ret.group())
print(ret.group(1))
print(ret.group(2))
print(ret.group(3))
结果:
<a>wahaha</b>
a
wahaha
b
正则表达式进阶
1 分组命名
(?P<name>正则表达式) 表示给分组起名字
(?P=name)表示使用这个分组,这里匹配到的内容应该和分组中的内容完全相同
2 通过索引使用分组
\1 表示使用第一组,匹配到的内容必须和第一个组中的内容完全相同
import re
ret=re.search("<(?P<name>\w+)>\w+</(?P=name)>","<a>wahaha</a>")
print(ret.group())
print(ret.group("name"))
结果:
<a>wahaha</a>
a

import re
ret = re.search(r'<(\w+)>\w+</\1>',r"<a>wahaha</a>")
print(ret.group(1))
print(ret.group())
结果:
a
<a>wahaha</a>

import re
ret=re.search(r"<(?P<asd>\w+)>(?P<zxc>\w+)</\w+>",r"<a>wahaha</a>")
print(ret.group("asd"))
print(ret.group("zxc"))
结果:
a
wahaha
爬虫
import re
from urllib.request import urlopen
# 内置的包 来获取网页的源代码 字符串
# res = urlopen('http://www.cnblogs.com/Eva-J/articles/7228075.html')
# print(res.read().decode('utf-8'))

def getPage(url):
response = urlopen(url)
return response.read().decode('utf-8')

def parsePage(s): # s 网页源码
ret = com.finditer(s)
for i in ret:
ret = {
"id": i.group("id"),
"title": i.group("title"),
"rating_num": i.group("rating_num"),
"comment_num": i.group("comment_num")
}
yield ret

def main(num):
url = 'https://movie.douban.com/top250?start=%s&filter=' % num # 0
response_html = getPage(url) # response_html是这个网页的源码 str
ret = parsePage(response_html) # 生成器
print(ret)
f = open("move_info7", "a", encoding="utf8")
for obj in ret:
print(obj)
data = str(obj)
f.write(data + "\n")
f.close()

com = re.compile(
'<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>\d+).*?<span class="title">(?P<title>.*?)</span>'
'.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S)
count = 0
for i in range(10):
main(count) # count = 0
count += 25

 

# flags有很多可选值:
# 
# re.I(IGNORECASE)忽略大小写,括号内是完整的写法
# re.M(MULTILINE)多行模式,改变^和$的行为
# re.S(DOTALL)点可以匹配任意字符,包括换行符
# re.L(LOCALE)做本地化识别的匹配,表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境,不推荐使用
# re.U(UNICODE) 使用\w \W \s \S \d \D使用取决于unicode定义的字符属性。在python3中默认使用该flag
# re.X(VERBOSE)冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释

 

 

 

 

 

 

 

 

 

 









posted @ 2018-08-07 17:00  chenyibai  阅读(257)  评论(0编辑  收藏  举报