python day 25--正则表达式

一、字符组

1.[0-9]表示匹配0-9中的数字

2.[a-z]表示匹配a-z之间的字母

3.[A-Z]表示匹配大写的字母

4.[0-9a-zA-Z]匹配所有字母数字

二、元字符

1.\d 匹配任意数字   

2.\w 匹配字母数字下划线

3.\s 匹配任意空字符

4. \n 匹配换行符

5.\t 匹配制表符

6. .(点)匹配除换行符之外的任意字符

7.\D 匹配除数字之外的任意字符

8. \W 匹配除字母数字下划线之外的任意字符

9.\S 匹配非空字符

10.a|b,匹配符合a或b的字符,当条件有重叠时,应该把范围广的放在左边。

11.(),分组匹配,一般搭配RE模块中的findall,search使用表示优先匹配。

12.[...]  匹配字符组中的字符

13 [^...]  匹配除字符组外的字符

三、量词

1.* 表示匹配0-无穷次的字符

2. + 匹配1-无穷次的字符

3. ?表示重复0次或一次,在量词的后面跟了一个 ? 表示取消贪婪匹配 :.*?跟上字符表示匹配任意字符知道找到符合条件的字符就不在找。

4.{n}表示前面的重复n次

5.{n,}表示至少重复n次

6.{n,m}表示重复n-m次,但是以匹配数量多的优先

四、转义符

在python中\有特殊意义,比如\n表示换行,如果要匹配‘\n’需要在前面加上\,就是'\\n'。如果要匹配‘\\n’,就是‘\\\\n’两个\\。如果有多个\\就要加几个\\会有点麻烦,所以只需要在前面加r',r'\n就可以了。

五、re模块的常用方法

1. findall

import re
# ret = re.findall('-0\.\d+|-[1-9]\d*(\.\d+)?','-1asdada-200')#前面是正则表达式,后面是待匹配的字符
ret = re.finditer('\d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
# ret1 = re.findall('www.(oldboy).com','www.oldboy.com')#会优先匹配括号里的正则表达式,结果:oldboy,(:?oldboy):?表示取消优先匹配
# print(ret)

2.search  

# ret = re.search('\d+(.\d+)(.\d+)(.\d+)?','1.2.3.4-2(60(-40.35/5)-(-4*3))')
# print(ret.group())
# print(ret.group(1))
# print(ret.group(2))
# print(ret.group(3))
#search可以节省内存,但是打印时要加上.group(),(1)表示显示第一个,不加数字表示显示全部

3.spilt

# ret = re.split('\d+','alex83egon20taibai40')
# print(ret)
按照匹配到的结果进行切割

4.分组命名

# ret = re.search(r'<(?P<tag>\w+)>(?P<c>\w+)</(\w+)>',r'<a>wahaha</b>')
# print(ret.group())
# print(ret.group('tag'))
# print(ret.group('c'))
?P<名字>,可以给匹配到的内容命名,这样.group(名字),可以输出指定名字的内容
 

5.爬虫练习

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):   # 获取 网页源码
  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)
    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

猜你喜欢

转载自www.cnblogs.com/snackpython/p/10116439.html