python学习——re模块

re模块

  • findall***** 返回列表,找所有的匹配结果
    • 语法:findall('正则表达式','待匹配字符串',flag)
  • search***** 返回一个内存地址,这是一个正则匹配的结果span是索引,match是匹配结果,通过group取值;没有对应匹配结果就返回None,group会报错
    • 语法:search(‘正则表达式’,‘待匹配字符串’)
    • ret = re.search('\d+','fdaf1123afda23')
    • if ret: # 内存地址,这是一个正则匹配的结果
      • print(ret.group())# 通过ret.group()获得真正的记过
  • match** 相当于search的正则表达式汇总加了一个^,只能从头开始匹配
    • ret = re.match('\d+$','128fdasfd')
    • print(ret)
  • split** 返回列表,按照正则规则切割,默认去、匹配到的内容会被切掉
    • ret = re.split('\d+',s)
    • print(ret)
  • sub/subn** 替换,按照正则规则去寻找要被替掉的内容,subn返回元组,第二个值是替换的次数
  • compile***** 编一个正则表达式,用这个结果去search、match、findall、finditer,能够节省时间
    • ret = re.compile('正则') # 已经完成编译
    • ret.findall('待匹配字符串')
  • finditer***** 返回一个迭代器,所有的结果都在这个迭代器中,需要通过循环+group的形式取值,能够节省内存

    ret = re.finditer('正则',’带匹配str‘)

    for i in ret:

      print(i.group())

 

 

findall:匹配所有每一项都是列表中的一个元素

1 import re
2 ret = re.findall('\d+','qgadgeafd798a') #正则表达式,带匹配的字符串,flag
3 ret1 = re.findall('\d','qgadgeafd798a')
4 print(ret)
5 print(ret1)

search:只匹配从左到右的第一个,得到的不是直接的结果,而是一个变量,通过这个变量的group方法获取结果,如果没有匹配到会返回None,使用group会报错

import re
ret = re.search('\d+','qgadgeafd798a') if ret: print(ret) #返回内存地址,这是一个正则匹配的结果 print(ret.group()) #通过ret。group()获取真正的结果

 



math 从头开始匹配,相当于search中的正则表达式加上^

ret = re.match('\d+','qgadgeafd798a')
print(ret)

 


字符串处理的扩展:替换 切割
split 按照正则表达式的内容切割

s = 'alex83taibai40egon25'
ret = re.split('\d+',s)
print(ret)


sub 替换 谁 旧的 新的 替换次数

ret = re.sub('\d+','H','alex83taibai40egon25')
print(ret)

 


 subn 返回一个元组第二个元素是替换次数

ret = re.subn('\d+','H','alex83taibai40egon25')
print(ret)

 

re模块的进阶
  compile 节省你是用正则表达式解决问题的时间,编译 将正则表达式编译成字节码,在多次使用过程中,不会多次编译

ret = re.compile('\d+')
print(ret)
res = ret.findall('alex83taibai40egon25')
print(res)
ress = ret.search('alex83taibai40egon25')
print(ress.group())

  finditer 节省你是用正则表达式解决问题的空间

ret = re.finditer('\d+','alex83taibai40egon25')
print(ret)
for i in ret:
print(i.group())

 

 

import re
s = '<a>wahaha</a>' #   标签语言html
ret = re.search('<(\w+)>(\w+)</(\w+)>',s)
print(ret.group())#所有结果
print(ret.group(0))#所有结果
print(ret.group(1))#数字参数代表的是去对应分组中的内容
print(ret.group(2))
print(ret.group(3))

为了findall也可以顺利娶到分组中的内容,有一个特殊语法,就是优先显示分组中的内容
ret = re.findall('\w+',s)
print(ret)
ret = re.findall('>(\w+)<',s)
print(ret)

 


取消分组优先(?:正则表达式)
ret = re.findall('\d+(\.\d+)?','1.234*')
print(ret)

关于分组
对于正则表达式来说,有些时候我们需要进行分组,来整体约束某一组字符出现的次数  
(\.[\w]+)?

对于python语言来说,分组可以帮助你更好更精准的找到你真正需要的内容
<(\w+)>w(\w+)</(\w+)>

split 添加分组()保留被切掉的正则表达式
ret = re.split('\d+','alex83taibai40egon25')
print(ret)
ret = re.split('(\d+)','alex83taibai40egon25')
print(ret)

 



python和正则表达式之间的特殊约定

分组命名 (?P<这个组的名字>这则表达式)
s = '<a>wahaha</a>'
ret = re.search('>(?P<con>\w+)<',s)
print(ret.group(1))
print(ret.group('con'))

s = '<a>wahaha</b>'
pattern = '<(?P<tab>\w+)>(\w+)</(?P=tab)>'
ret = re.search(pattern,s)
print(ret)

 

你要匹配的内容太美有特点了,容易和你不想匹配的内容混在一起,精准的取到整数,过滤掉小数

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']
ret=re.findall(r"-?\d+\.\d*|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) #['1', '-2', '60', '', '5', '-4', '3']
ret.remove("")
print(ret) #['1', '-2', '60', '5', '-4', '3']

正则表达式如果写的足够好,能够最大限度的简化我们的操作

正则表达式到底重要到什么程度
掌握作业中的所有内容
能够看懂常用的正则表达式
并且能够做出一些公司特异性要求的修改

简单了解爬虫实例
import re
import json
from urllib.request import urlopen

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:
        yield {
            "id": i.group("id"),
            "title": i.group("title"),
            "rating_num": i.group("rating_num"),
            "comment_num": i.group("comment_num"),
        }

def main(num):
    url = 'https://movie.douban.com/top250?start=%s&filter=' % num
    response_html = getPage(url)
    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")

count = 0
for i in range(10):
    main(count)
    count += 25
posted @ 2019-08-13 22:11  陪伴is最长情的告白  阅读(190)  评论(0编辑  收藏  举报