zoukankan      html  css  js  c++  java
  • python 正则表达式

    什么是正则表达式?

    正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串",这个“规则字符串”用来表达对字符串的一种过滤逻辑

    非Python独有,re模块实现

    常见匹配模式

    模式 描述
    \w 匹配字符数字及下划线
    \W 匹配非字母数字下划线
    \s 匹配任意空白字符,等价于[\t\n\r\f]
    \S 匹配任意非空白字符
    \d 匹配任意数字,等价雨[0-9]
    \D 匹配任意非数字
    \A 匹配字符串开始
    \Z 匹配字符串结束,如果存在换行,只匹配到换行前的结束字符串
    \z 匹配字符串结束
    \G 匹配最后匹配完成的位置
    \n 匹配一个换行符
    \t 匹配一个制表符
    ^ 匹配字符串的开头
    $ 匹配字符串的末尾
    . 匹配任意字符,除了换行符,当re。DOTALL标记被指定时,则可以匹配包括换行符的任意字符
    [...] 用来表示一组字符,单独列出:[amk]匹配'a','m'或'k'
    [^...] 不在[]重的字符:[^abc]匹配除了a,b,c之外的字符
    • | 匹配0个或多个的表达式
    • | 匹配1个或多个的表达式
      ? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪模式
      {n} | 精确匹配n个前面表达式
      {n,m}|匹配n到m次由前面的正则表达式定义的片段
      () |匹配括号内的表达式,也表示一个组

    re.match

    re.match 常识从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就会返回none

    re.match(pattern,string,flags=0)
    

    最常规的匹配

    import re
    content = 'Hello 123 4567 World_This is a Regex Demo'
    result = re.match('^Hello\s\d\d\d\s',content)
    print(result)
    print(result.group())
    print(result.span())
    

    泛匹配

    import re
    content = 'Hello 123 4567 World_This is a Regex Demo'
    result = re.match('^Hello\s\d\d\d\s',content)
    print(result)
    print(result.group())
    print(result.span())
    

    匹配目标

    import re
    content = 'Hello 1234567 World_This is a Regex Demo'
    result = re.match('^Hello\s(\d+)\sWorld.*Demo$',content)
    print(result)
    print(result.group(1))
    print(result.span())
    

    贪婪匹配

    import re
    content = 'Hello 1234567 World_This is a Regex Demo'
    result = re.match('^He.*(\d+).*Demo$',content)
    print(result)
    print(result.group(1))
    

    非贪婪匹配

    import re
    content = 'Hello 1234567 World_This is a Regex Demo'
    result = re.match('^He.*?(\d+).*Demo$',content)
    print(result)
    print(result.group(1))
    

    匹配模式

    import re
    content = '''Hello 1234567 World_This
    is a Regex Demo'''
    result = re.match('^He.*?(\d+).*?Demo$',content,re.S)
    print(result.group())
    

    转义

    import re
    content = 'price is $5.00'
    result = re.match('price is $5.00',content)
    print(result)
    
    import re
    content = 'price is $5.00'
    result = re.match('price is \$5\.00',content)
    print(result.group())
    

    总结:尽量使用泛匹配、使用括号得到匹配目标、尽量使用非贪婪模式、有换行符就用re.S

    re.search

    re.search扫描整个字符串并返回第一个成功的匹配。

    import re
    content = 'Extra strings Hello 1234567 World_This is a Regex Demo Extra strings'
    result = re.match('Hello.*?(\d+).*?Demo',content)
    print(result)
    
    import re
    content = 'Extra strings Hello 1234567 World_This is a Regex Demo Extra strings'
    result = re.search('Hello.*?(\d+).*?Demo',content)
    print(result)
    print(result.group())
    

    总结:为匹配方便,能用search就不用match

    匹配演练

    import re
    html = '''<div id="songs-list>
    <h2 class="title">经典老歌</h2>
    <p class="introduction">
    经典老哥列表
    </p>
    <ul id="list" class="list-group">
        <li data-view="2">一路上有你</li>
        <li data-view="7">
            <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
        </li>
        <li data-view="4" class="active">
            <a href="/3.mp3" singer="齐秦">往事随风</a>
        </li>
        <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
        <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li>
        <li data-view="5">
            <a href="/6.mp3" singer="邓丽君"><i class="fa fa-user"></i>但愿人长久</a>
        </li>
    </ul>
    </div>"'''
    result = re.search('<li.*?active.*?singer="(.*?)">(.*?)</a>',html,re.S)
    if result:
        print(result.group(1),result.group(2))
    
    import re
    html = '''<div id="songs-list>
    <h2 class="title">经典老歌</h2>
    <p class="introduction">
    经典老哥列表
    </p>
    <ul id="list" class="list-group">
        <li data-view="2">一路上有你</li>
        <li data-view="7">
            <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
        </li>
        <li data-view="4" class="active">
            <a href="/3.mp3" singer="齐秦">往事随风</a>
        </li>
        <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
        <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li>
        <li data-view="5">
            <a href="/6.mp3" singer="邓丽君"><i class="fa fa-user"></i>但愿人长久</a>
        </li>
    </ul>
    </div>"'''
    result = re.search('<li.*?singer="(.*?)">(.*?)</a>',html,re.S)
    if result:
        print(result.group(1),result.group(2))
    
    import re
    html = '''<div id="songs-list>
    <h2 class="title">经典老歌</h2>
    <p class="introduction">
    经典老哥列表
    </p>
    <ul id="list" class="list-group">
        <li data-view="2">一路上有你</li>
        <li data-view="7">
            <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
        </li>
        <li data-view="4" class="active">
            <a href="/3.mp3" singer="齐秦">往事随风</a>
        </li>
        <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
        <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li>
        <li data-view="5">
            <a href="/6.mp3" singer="邓丽君"><i class="fa fa-user"></i>但愿人长久</a>
        </li>
    </ul>
    </div>"'''
    result = re.search('<li.*?singer="(.*?)">(.*?)</a>',html)
    if result:
        print(result.group(1),result.group(2))
    

    re.findall

    搜索字符串,以列表形式返回全部能匹配的子串

    import re
    html = '''<div id="songs-list>
    <h2 class="title">经典老歌</h2>
    <p class="introduction">
    经典老哥列表
    </p>
    <ul id="list" class="list-group">
        <li data-view="2">一路上有你</li>
        <li data-view="7">
            <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
        </li>
        <li data-view="4" class="active">
            <a href="/3.mp3" singer="齐秦">往事随风</a>
        </li>
        <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
        <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li>
        <li data-view="5">
            <a href="/6.mp3" singer="邓丽君">但愿人长久</a>
        </li>
    </ul>
    </div>"'''
    results = re.findall('<li.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>',html,re.S)
    print(results)
    print(type(results))
    for result in results:
        print(result)
        print(result[0],result[1],result[2])
    
    import re
    html = '''<div id="songs-list>
    <h2 class="title">经典老歌</h2>
    <p class="introduction">
    经典老哥列表
    </p>
    <ul id="list" class="list-group">
        <li data-view="2">一路上有你</li>
        <li data-view="7">
            <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
        </li>
        <li data-view="4" class="active">
            <a href="/3.mp3" singer="齐秦">往事随风</a>
        </li>
        <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
        <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li>
        <li data-view="5">
            <a href="/6.mp3" singer="邓丽君"><i class="fa fa-user"></i>但愿人长久</a>
        </li>
    </ul>
    </div>"'''
    results = re.findall('<li.*?>\s*?(<a.*?>)?(\w+)(</a>)?\s*?</li>',html,re.S)
    print(results)
    for result in results:
        print(result[1])
    

    re.sub

    替换字符串每一个匹配的字串后的字符串

    import re
    content = 'Extra strings Hello 1234567 World_This is a Regex Demo Extra strings'
    content = re.sub("\d+",'',content)
    print(content)
    
    import re
    content = 'Extra strings Hello 1234567 World_This is a Regex Demo Extra strings'
    content = re.sub('\d+','replacement',content)
    print(content)
    
    import re
    content = 'Extra strings Hello 1234567 World_This is a Regex Demo Extra strings'
    content = re.sub('(\d+)',r'\1 8910',content)
    print(content)
    
    import re
    html = '''<div id="songs-list>
    <h2 class="title">经典老歌</h2>
    <p class="introduction">
    经典老哥列表
    </p>
    <ul id="list" class="list-group">
        <li data-view="2">一路上有你</li>
        <li data-view="7">
            <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
        </li>
        <li data-view="4" class="active">
            <a href="/3.mp3" singer="齐秦">往事随风</a>
        </li>
        <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
        <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li>
        <li data-view="5">
            <a href="/6.mp3" singer="邓丽君">但愿人长久</a>
        </li>
    </ul>
    </div>"'''
    html = re.sub('<a.*?>|</a>','',html)
    print(html)
    results =re.findall('<li.*?>(.*?)</li>',html,re.S)
    print(results)
    for result in results:
        print(result[0],result[1],result[2])
    

    re.compile

    将正则字符串编译成正则表达式对象
    将一个正则表达式串编译成正则对象,以便于复用该匹配模式

    import re
    content = '''Hello 1234567 World_This
    is a Regex Demo'''
    pattern = re.compile('Hello.*Demo',re.S)
    result = re.match(pattern,content)
    # result = re.match('Hello.*Demo',content,re.S)
    print(result)
    

    实战练习

    import requests
    import re 
    content = requests.get('https://book.douban.com/').text
    pattern = re.compile('<li.*?cover.*?href="(.*?)".*?title="(.*?)".*?more-meta.*?author">(.*?)</span>.*?year">(.*?)<span>.*?</li>',re.S)
    results = re.findall(pattern,content)
    print(results)
    
    大道理谁都懂,鸡汤也听过,可我们为什么还是过不好这一生。
  • 相关阅读:
    开放源码的对象关系映射工具ORM.NET 插入数据 Insert/Update Data
    开放源码的对象关系映射工具ORM.NET 快档开发入门 Quick Start
    .NET 动态脚本语言Script.NET 开发指南
    开放源码的对象关系映射工具ORM.NET 删除数据 Deleting Records using ORM.NET
    .NET Remoting过时了吗?为什么公司的项目还是选择用.NET Remoting,而不是WCF?
    开放源码的对象关系映射工具ORM.NET 查看和显示数据 View and Display data using ORM.NET
    开放源码的对象关系映射工具ORM.NET 查询表 调用存储过程 增加自定义代码
    技术人生:坚持,每日一博
    CQRS:CQRS + DDD + MDP 实现快速应用程序开发
    NodeJs:Happy代码生成器,重构了代码,更新了文档,完善了示例,欢迎下载使用
  • 原文地址:https://www.cnblogs.com/puqunzhu/p/9809718.html
Copyright © 2011-2022 走看看