14python模块之re

1、re模块的基础方法

  1.1查找

    findall:返回列表 找到所有的匹配项

    search:匹配成功就返回一个变量,通过group取匹配到的第一个值,不匹配就返回None,group报错

1 ret2 = re.search('d+','asd123sdf43asd23')
2 print(ret2)  # 打印的是内存地址,这是一个正则匹配的结果
3 print(ret2.group())  #通过ret.group()来获取真正的结果

    match:相当鱼search的正则表达式中加了一个'^',其余没有区别

  1.2切割和替换

    split:返回列表,按照正则规则去切割,默认匹配到的内容会被切割

1 s = 'john23faker27chuang50'
2 ret3 = re.split('d+',s)
3 print(ret3)
4 
5 #打印结果为:['john', 'faker', 'chuang', '']

    sub/subn:替换,按照正则规则去寻找要被替换掉的内容,subn返回元祖,第二个值是替换的次数

# sub替换 (正则,替换的结果,需要替换的内容,替换的次数)
ret4 = re.sub('d+', 'H', 'john23faker27chuang50', 1)
print(ret4)

打印结果为:johnHfaker27chuang50

  1.3编译和迭代器

    compile:编译一个正则表达式,用这个结果去search math findall finditer 能够节省时间

    finditer:返回一个迭代器,所有的结果都在这个迭代器中,需要通过循环+group的形式取值,能够节省内存

2、关于分组在re模块中的使用

  2.1关于分组优先在findall中的用法:---(w+)

1 #python正则默认分组优先:(这个和正则本身无关)
2 s = '<a>wahaha</a>'
3 ret = re.findall('>(w+)<',s)
4 print(ret)   # 预期:>wahaha<   实际:wahaha  就是分组优先
5 ret2 = re.findall('>(?:w+)<',s)  #组内最前面加上?:表示取消分组优先
6 print(ret2)   # 正常打印

  2.2关于分组优先在split中的用法:

# split
ret3 = re.split('d+','john23faker27chuang50')  # 切割的内容不会保留
ret4 = re.split('(d+)','john23faker27chuang50')  # 切割的内容会保留
print(ret3)
print(ret4)

  2.3分组命名

# 分组命名,使用前面的分组 要求使用这个名字的分组和掐面同名分组中的内容匹配的必须一致。(用python也可以直接实现)
s = '<a>wahaha</a>'
pattern = '<(?P<tab>w+)>(w+)</(?P=tab)>'
ret = re.search(pattern, s)
print(ret)

  上述代码,如果将a标签的结束标签改变一下,则会返回None。

  2.4.分组在re模块中的方法之search:

1 import re
2 s = '<a>wahaha</a>'
3 ret = re.search('<(w+)>(w+)</(w+)>',s)
4 print(ret.group())  # 所有的结果
5 print(ret.group(1))
6 print(ret.group(2))
7 print(ret.group(3))

  这是最基础的通过.group(index)来取分组中的内容

  如果给分组起名字的话,也可以直接通过.group(name)来取分组中的内容( 正则(?P<name>正则)      使用这个分组 ?P=name)

3、用正则写的一个简易爬虫demo

  纯正则提取,函数写。

  

 1 # coding:utf-8
 2 import re
 3 from urllib.request import urlopen
 4 
 5 
 6 def getPage(url):  # 获取整个html的字符串
 7     response = urlopen(url)
 8     return response.read().decode('utf-8')
 9 
10 
11 def parsePage(s):
12     ret = com.finditer(s)  # 从这个html中,找到所有符合com正则表达式规则的内容并且以迭代器的形式返回
13     for i in ret:
14         yield {
15             "id": i.group("id"),
16             "title": i.group("title"),
17             "rating_num": i.group("rating_num"),
18             "comment_num": i.group("comment_num")
19         }
20 
21 
22 def main(num):
23     url = 'https://movie.douban.com/top250?start=%s&filter=' %num
24     response_html = getPage(url)
25     ret = parsePage(response_html)
26     print(ret)
27     f = open("move_info7", "a", encoding="utf8")
28 
29     for obj in ret:
30         print(obj)
31         data = str(obj)
32         f.write(data + "
")
33 
34 
35 com = re.compile(
36     '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>d+).*?<span class="title">(?P<title>.*?)</span>'
37     '.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S)
38 
39 count = 0
40 for i in range(10):
41     main(count)
42     count += 25
原文地址:https://www.cnblogs.com/cbslock/p/11153506.html