---恢复内容开始---

  • 常用的正则匹配规则

    • 元字符

    • 量词

    • 字符组

    • 字符集

    • 转义符

    • 贪婪匹配

  • re模块使用正则表达式

    • 实例引入(是否使用re模块和正则表达式的区别)

       # 不使用正则表达式
      phone_number = input("请输入一个11位数导入手机号码 :")
      if len(phone_number) == 11 \
      and phone_number.isdigit() \
      and (phone_number.startswith('')
      or phone_number.startswith('')
      or phone_number.startswith('')
      or phone_number.startswith('')
      or phone_number.startswith('')):
      print("这个手机好码是合法的")
      else:
      print("这个手机号码是不合法的") # 调用re模块使用正则表达式
      import re
      phone_number = input("请输入一个11位数导入手机号码 :")
      if re.match('^(13|15|17|18|19)[0-9]{9}$', phone_number): # 正则规则 : ^(13|15|17|18|19)[0-9]{9}$
      print("这个手机好码是合法的")
      else:
      print("这个手机号码是不合法的")

      实例中涉及到内置函数starswich()函数

       # startswith()函数
      # string.startswith(str, beg=0,end=len(string))
      # 或string[beg:end].startswith(str)
      # 1、string:被检测的字符串 2、str:指定的字符或者子字符串 3、 beg:设置字符串检测的起始位置
      # 4、end:设置字符串检测的结束位置
    • match()

      • # match是从头开始匹配,如果正则规则开头可以匹配上,就返回一个变量。匹配的内容需要调用group才能显示。
        # 如果没有找到,则返回None,调用group会报错
         import re
        
         string = 'Hello! Regular expression, 520'
        result = re.match('^Hello!\s\w*\s\w+.\s\d{3}', string=string) print(len(string), result, result.group(), result.span(), sep='\n\n') # 输出:
        30 <re.Match object; span=(0, 30), match='Hello! Regular expression, 520'> Hello! Regular expression, 520 (0, 30) # span()方法可以输出皮牌的范围
    • 修饰符

      re.I                    使匹配对大小写不敏感

      re.L                   做本地化识别( locale-aware )匹配

      re.M                  多行匹配,影响^和$

      re.S.                   使 .匹配包括换行在内的所有字符

      re.U.                  根据Unicode字符集解析字符。 这个标志影响\w、\W、\b和\B

      re.X.                  该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解

      例如:

       import re
      string = 'Hello! Regular expression, 520'
      result = re.match('^Hello!\s\w*\s\w+.\s\d{3}', string, re.S)
    • search()

      # search是从前往后,寻找到一个就返回,返回的变量需要调用group才能拿到结果。如果没有找到,那么返回None,调用group回报错
       import re
      
       string =  'Hello! Regular expression, 5201314,Learning makes me happy and addicted to learning.'
      regular = 'Hello!\s\w*\s\w+.\s\d{3}' ret = re.search(regular, string)
      # 从前面往后面找到一个"Hello!\s\w*\s\w+.\s\d{3}"就返回
      print(ret) # 返回的是一个对象 : <re.Match object; span=(0, 30), match='Hello! Regular expression, 520'>

---恢复内容结束---

  • 常用的正则匹配规则

    • 元字符

    • 量词

    • 字符组

    • 字符集

    • 转义符

    • 贪婪匹配

  • re模块使用正则表达式

    • 实例引入(是否使用re模块和正则表达式的区别)

       # 不使用正则表达式
      phone_number = input("请输入一个11位数导入手机号码 :")
      if len(phone_number) == 11 \
      and phone_number.isdigit() \
      and (phone_number.startswith('')
      or phone_number.startswith('')
      or phone_number.startswith('')
      or phone_number.startswith('')
      or phone_number.startswith('')):
      print("这个手机好码是合法的")
      else:
      print("这个手机号码是不合法的") # 调用re模块使用正则表达式
      import re
      phone_number = input("请输入一个11位数导入手机号码 :")
      if re.match('^(13|15|17|18|19)[0-9]{9}$', phone_number): # 正则规则 : ^(13|15|17|18|19)[0-9]{9}$
      print("这个手机好码是合法的")
      else:
      print("这个手机号码是不合法的")

      实例中涉及到内置函数starswich()函数

       # startswith()函数
      # string.startswith(str, beg=0,end=len(string))
      # 或string[beg:end].startswith(str)
      # 1、string:被检测的字符串 2、str:指定的字符或者子字符串 3、 beg:设置字符串检测的起始位置
      # 4、end:设置字符串检测的结束位置
    • match()

      • # match是从头开始匹配,如果正则规则开头可以匹配上,就返回一个变量。匹配的内容需要调用group才能显示。
        # 如果没有找到,则返回None,调用group会报错
         import re
        
         string = 'Hello! Regular expression, 520'
        result = re.match('^Hello!\s\w*\s\w+.\s\d{3}', string=string) print(len(string), result, result.group(), result.span(), sep='\n\n') # 输出:
        30 <re.Match object; span=(0, 30), match='Hello! Regular expression, 520'> Hello! Regular expression, 520 (0, 30) # span()方法可以输出皮牌的范围
    • 修饰符

      re.I                    使匹配对大小写不敏感

      re.L                   做本地化识别( locale-aware )匹配

      re.M                  多行匹配,影响^和$

      re.S.                   使 .匹配包括换行在内的所有字符

      re.U.                  根据Unicode字符集解析字符。 这个标志影响\w、\W、\b和\B

      re.X.                  该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解

      例如:

       import re
      string = 'Hello! Regular expression, 520'
      result = re.match('^Hello!\s\w*\s\w+.\s\d{3}', string, re.S)
    • search()

      # search是从前往后,寻找到一个就返回,返回的变量需要调用group才能拿到结果。如果没有找到,那么返回None,调用group回报错
       import re
      
       string =  'Hello! Regular expression, 5201314,Learning makes me happy and addicted to learning.'
      regular = 'Hello!\s\w*\s\w+.\s\d{3}' ret = re.search(regular, string)
      # 从前面往后面找到一个"Hello!\s\w*\s\w+.\s\d{3}"就返回
      print(ret) # 返回的是一个对象 : <re.Match object; span=(0, 30), match='Hello! Regular expression, 520'>
    • findall()

      # 想要获取匹配正则表达式的所有内容,借助findall()方法,该方法会搜索整个字符串
       ret = re.findall('[a-z]+', 'eva egon yuan')
      # 返回所有满足匹配条件的结果,放在列表里
      print(ret)
      # 输出:['eva', 'egon', 'yuan']
    • sub()

      # sub()方法修改文本
       ret = re.sub('\d', '马冬梅', '马什么梅? 0 马什么冬? 0 冬什么梅? 0', 3)
      # 将数字替换成'马冬梅',其中3代表替换了3次
      print(ret)
      # 输出:
      马什么梅? 马冬梅 马什么冬? 马冬梅 冬什么梅? 马冬梅
    • subn()

      # subn()方法和sub()方法很相似
       import re
      
       ret = re.subn('\d', '马冬梅', '马什么梅? 0 马什么冬? 0 冬什么梅? 0')
      # 将数字替换成'马冬梅',返回元组(替换的结果,替换了多少次)
      print(ret)
      # 输出:
      ('马什么梅? 马冬梅 马什么冬? 马冬梅 冬什么梅? 马冬梅', 3)
    • compile()

      # 将正则字符串编译成一个正则表达式对象
       import re
      
       obj = re.compile('\d{3}')
      # 将正则表达式编译成一个正则表达式对象,这里正则规则是要匹配三个数字
      ret = obj.search('abc123cba')
      # 正则表达式对象调用search,参数为待匹配的字符串
      print(ret.group())
      # 输出结果 : 123
    • finditer()

      # 返回一个存放匹配结果的迭代器
       import re
      
       ret = re.finditer('\d', 'ab2cd4567efg')     # finditer返回一个存放匹配结果的迭代器
      print(ret)
      print(next(ret).group()) # 查看第一个结果
      print(next(ret).group()) # 查看第二个结果
      print(i.group() for i in ret) # 查看剩余的所有结果 # 上一条print已经输出了所有的结果,所以这个for循环不输出任何字符
      for i in ret:
      print(i.group()) # 输出:
      <callable_iterator object at 0x10a077cf8>
      2
      4
      <generator object <genexpr> at 0x1142f5f48>
      5
      6
      7
    • 举例理解正则、re

       ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
      print(ret) # # ['oldboy'] 这是因为findall会优先匹配结果组内容返回,如果想要匹配结果,取消权限即可 ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
      print(ret) # # ['www.oldboy.com'] 取消优先级别的权限

      优先级别(?:)

       ret = re.split('\d+', 'eva3egon4yuan')
      print(ret) # 结果 : ['eva', 'egon', 'yuan'] ret = re.split('(\d+)', 'eva3egon4yuan')
      print(ret) # 结果 : ['eva', '3', 'egon', '4', 'yuan'] # 在匹配部分加上()之后,切出的结果是不同的,
      # 没有()的没有保留匹配的项,但是有()却能够保留匹配的项
      # 这个在某些需要保留匹配部分的使用过程是非常重要的

      (保留项)

       ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>", "<hi>hello</hi>")
      # 还可以利用?P<name>的形式给分组起个名字
      # 获取匹配的结果可以直接用group('名字')拿到对应的值
      print(ret.group('tag_name')) # 结果 : hi
      print(ret.group()) # 结果 : <hi>hello</hi>

      ?P给分组起名

       ret = re.search("<(\w+)>\w+</\1>", "<hi>hello</hi>")
      # 如果不给组起名字也可以用\序号来找到对应的组,表示要找的内容要和前面组的内容一致
      # 获取匹配的结果可以用group(序号)拿到对应的值
      print(ret.group(1))
      print(ret.group())

      组序号

      正则在线测试网址:http://tool.chinaz.com/regex/

  • 抓取猫眼电影

     from urllib import request
    import re for i in range(27736):
    url = 'https://maoyan.com/films?showType=3&offset={0:}'.format(i * 30)
    response = request.urlopen(url=url)
    html = response.read().decode('utf-8')
    result = re.search('<dd>.*?title="(.*?)">.*?{movieId:(.*?)}">.*?(\d\.).*?(\d)</i></div>', html, re.S)
    dictionaries = {
    'Movie Item Title': result.group(1),
    'Movie ID': int(result.group(2)),
    'Movie Score': float(result.group(3) + result.group(4))
    }
    print(dictionaries)

    有时候会报错,待完善

     import requests
    import re
    from requests.exceptions import RequestException
    import json
    import time # 抓取首页
    def get_one_page(url):
    try:
    headers = {
    # 伪浏览器
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'
    }
    response = requests.get(url, headers) # 响应
    # 根据状态码返回响应内容
    if response.status_code == 200:
    return response.text
    return None
    # 请求异常
    except RequestException:
    return None # 正则表达式提取所需内容
    def paser_one_page(html):
    # 正则
    pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
    '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
    '.*?integer">(.*?)</i>.*?fraction">(.*?)</i></p>.*?</dd>', re.S)
    # 提取内容
    items = re.findall(pattern, html)
    print(items)
    # 每部电影对应一个字典
    for item in items:
    yield{
    'index': item[0], # 电影排名
    'image': item[1], # 电影图片
    'title': item[2], # 电影名称
    'actor': item[3].strip()[3:], # 演员
    'time': item[4].strip()[5:], # 上映时间
    'score': item[5]+item[6] # 电影评分
    } # 将提取的内容写入文件
    def write_to_file(content):
    with open('result.txt', 'a', encoding='utf-8') as f:
    # 通过json.dumps(),实现字典的序列化,指定ensure_ascii=False保证输出结果是中文形式而不是Unicode编码
    f.write(json.dumps(content, ensure_ascii=False)+'\n')
    f.close() def main(offset):
    url = 'http://maoyan.com/board/4?offset='+str(offset) # URL
    html = get_one_page(url) # 抓取网页
    paser_one_page(html) # 提取抓取的内容
    for item in paser_one_page(html): # 输出结果和写入文件
    print(item)
    write_to_file(item) if __name__ == '__main__':
    for i in range(10):
    main(offset=i*10)
    time.sleep(1) # 现在猫眼多了反爬虫 , 如果速度过快,则会无响应,所以这里又增加了一个延时等待 # 运行后,生成一个result.txt文件,输出内容雨文件内容一致

正则表达式和python中的re模块的更多相关文章

  1. 常用正则表达式与python中的re模块

    正则表达式是一种通用的字符串匹配技术,不会因为编程语言不一样而发生变化. 部分常用正则表达式规则介绍: . 匹配任意的一个字符串,除了\n * 匹配任意字符串0次或者任意次 \w 匹配字母.数字.下划 ...

  2. (转)正则表达式与Python(RE)模块

    Python正则表达式指南  原文:http://blog.csdn.net/qdx411324962/article/details/46799831 Python3(2):正则表达式与Python ...

  3. Python中的re模块--正则表达式

    Python中的re模块--正则表达式 使用match从字符串开头匹配 以匹配国内手机号为例,通常手机号为11位,以1开头.大概是这样13509094747,(这个号码是我随便写的,请不要拨打),我们 ...

  4. 正则表达式与Python中re模块的使用

    正则表达式与Python中re模块的使用 最近做了点爬虫,正则表达式使用的非常多,用Python做的话会用到re模块. 本文总结一下正则表达式与re模块的基础与使用. 另外,给大家介绍一个在线测试正则 ...

  5. Python中的random模块,来自于Capricorn的实验室

    Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...

  6. Python中的logging模块

    http://python.jobbole.com/86887/ 最近修改了项目里的logging相关功能,用到了python标准库里的logging模块,在此做一些记录.主要是从官方文档和stack ...

  7. Python中的random模块

    Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...

  8. 浅析Python中的struct模块

    最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查阅了相关资料大概了解了,在这里做一下简单的总结. 了解c语言 ...

  9. python中的StringIO模块

    python中的StringIO模块 标签:python StringIO 此模块主要用于在内存缓冲区中读写数据.模块是用类编写的,只有一个StringIO类,所以它的可用方法都在类中.此类中的大部分 ...

随机推荐

  1. SkyWalking系列(一):初探

    SkyWalking已经再微服务商城系列里使用了,本篇将介绍如何再Windows系统下安装并简单使用. 1.下载SkyWaling 本篇测试使用6.0版本:http://skywalking.apac ...

  2. 除了Web和Node,JavaScript还能做什么

    前言 提起JavaScript,我们也许经常会想到的是,可以用来写Web页面嘛,又或者,会想起Node.js 这个服务端环境,搞前后端同构. 那么,除此之外, JavaScript还可以做什么?   ...

  3. Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer

    Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer: 启动Zookeeper 启动Kafka0.11 创建一个新的Topic: ./kafk ...

  4. Javascript设计模式——建造者模式

    建造者模式是相对比较简单的一种设计模式,属于创建型模式的一种: 定义:将一个复杂的对象分解成多个简单的对象来进行构建,将复杂的构建层与表现层分离,使相同的构建过程可以创建不同的表示模式:    优点: ...

  5. 死磕 java线程系列之线程池深入解析——体系结构

    (手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 简介 Java的线程池是块硬骨头,对线程池的源码做深入研究不仅能提高对Java整个并发编程的理解,也能提高自己 ...

  6. Java 爬虫服务器被屏蔽,不要慌,咱们换一台服务器

    这是 Java 爬虫系列博文的第四篇,在上一篇 Java 爬虫遇上数据异步加载,试试这两种办法! 中,我们从内置浏览器内核和反向解析法两个角度简单的聊了聊关于处理数据异步加载问题.在这篇文章中,我们简 ...

  7. B-概率论-贝叶斯决策

    目录 贝叶斯决策 一.贝叶斯决策理论 二.贝叶斯公式 2.1 从条件概率公式推导贝叶斯公式 2.2 从全概率公式推导贝叶斯公式 三.贝叶斯公式应用 更新.更全的<机器学习>的更新网站,更有 ...

  8. python编程基础之十二

    列表:一种有序的集合,可以同时存储多个数据,列表元素可修改,属于可变序列 创建列表: 列表名 = [列表选项一,列表选项二,列表选项三,......] list1 = [] list2 = [10,2 ...

  9. Java应用在docker环境配置容器健康检查

    在<极速体验docker容器健康>一文已体验了docker容器健康检查功能,今天就来给java应用的容器加入健康检查,使应用的状态随时都可以被监控和查看. 实战环境信息 操作系统:macO ...

  10. App自动化环境搭建

    1.安装Appium-desktop工具 下载地址:https://github.com/appium/appium-desktop/releases/tag/v1.8.2 2.安装Android环境 ...