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

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

    re.match

    re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。(一定要从第一个字符开始匹配,如果第一个字符不能匹配,后面的字符全部都不能匹配上)

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

    最常规的匹配

    import re
    
    content = 'Hello 123 4567 World_This is a Regex Demo'
    print(len(content))
    result = re.match('^Hellosdddsd{4}sw{10}.*Demo$', content)
    print(result)            \输出结果
    print(result.group())    \ 输出匹配的内容    
    print(result.span())        \ 输出匹配的范围
    41
    <_sre.SRE_Match object; span=(0, 41), match='Hello 123 4567 World_This is a Regex Demo'>
    Hello 123 4567 World_This is a Regex Demo
    (0, 41)

    泛匹配

    import re
    
    content = 'Hello 123 4567 World_This is a Regex Demo'
    result = re.match('^Hello.*Demo$', content)
    print(result)
    print(result.group())
    print(result.span())
    <_sre.SRE_Match object; span=(0, 41), match='Hello 123 4567 World_This is a Regex Demo'>
    Hello 123 4567 World_This is a Regex Demo
    (0, 41)

    匹配目标

    import re
    
    content = 'Hello 1234567 World_This is a Regex Demo'
    result = re.match('^Hellos(d+)sWorld.*Demo$', content)    \这里使用(d+),用括号将目标栝起d+代表一个或多个数字
    print(result)
    print(result.group(1))            \ 如果group(0)即整段匹配,group(1)就是对应上面(d+)
    print(result.span())
    <_sre.SRE_Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'>
    1234567
    (0, 40)

    贪婪匹配  (.*)

    import re
    
    content = 'Hello 1234567 World_This is a Regex Demo'
    result = re.match('^He.*(d+).*Demo$', content)         \ 使用.*配会尽量多的匹配,会把1-6都匹配进去
    print(result)
    print(result.group(1))
    <_sre.SRE_Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'>
    7      \所以这里得出来的结果只有 7

    非贪婪匹配 (?)

    import re
    
    content = 'Hello 1234567 World_This is a Regex Demo'
    result = re.match('^He.*?(d+).*Demo$', content)     \使用?是非贪婪模式,尽量少匹配的方式
    print(result)
    print(result.group(1))
    <_sre.SRE_Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'>
    1234567

    匹配模式

    import re
    
    content = '''Hello 1234567 World_This
    is a Regex Demo
    '''
    result = re.match('^He.*?(d+).*?Demo$', content, re.S)        \ .使用re.S参数后会包含
    换行符号
    print(result.group(1))
    1234567

    转义

    import re
    
    content = 'price is $5.00'
    result = re.match('price is $5.00', content)
    print(result)
    None
    import re
    
    content = 'price is $5.00'
    result = re.match('price is $5.00', content)
    print(result)
    <_sre.SRE_Match object; span=(0, 14), match='price is $5.00'>

    总结:尽量使用泛匹配、使用括号得到匹配目标、尽量使用非贪婪模式、有换行符就用re.S(主要包含换行符,例如html里面的文件)

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

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

    re.search 与 re.match区别

    import re
    
    content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
    result = re.match('Hello.*?(d+).*?Demo', content)
    print(result)
    None
    import re
    
    content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
    result = re.search('Hello.*?(d+).*?Demo', content)
    print(result)
    print(result.group(1))
    <_sre.SRE_Match object; span=(13, 53), match='Hello 1234567 World_This is a Regex Demo'>
    1234567

    总结:为匹配方便,能用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="邓丽君">但愿人长久</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="邓丽君">但愿人长久</a>
            </li>
        </ul>
    </div>'''
    result = re.search('<li.*?singer="(.*?)">(.*?)</a>', html)   \没有使用rc.S包含换行符号
    if result:
        print(result.group(1), result.group(2))
    beyond 光辉岁月

    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)        \这里直接返回一个list
    print(type(results))      
    for result in results:
        print(result)
        print(result[0], result[1], result[2])
    [('/2.mp3', '任贤齐', '沧海一声笑'), ('/3.mp3', '齐秦', '往事随风'), ('/4.mp3', 'beyond', '光辉岁月'), ('/5.mp3', '陈慧琳', '记事本'), ('/6.mp3', '邓丽君', '但愿人长久')]
    <class 'list'>
    ('/2.mp3', '任贤齐', '沧海一声笑')
    /2.mp3 任贤齐 沧海一声笑
    ('/3.mp3', '齐秦', '往事随风')
    /3.mp3 齐秦 往事随风
    ('/4.mp3', 'beyond', '光辉岁月')
    /4.mp3 beyond 光辉岁月
    ('/5.mp3', '陈慧琳', '记事本')
    /5.mp3 陈慧琳 记事本
    ('/6.mp3', '邓丽君', '但愿人长久')
    /6.mp3 邓丽君 但愿人长久

    re.sub

    替换字符串中每一个匹配的子串后返回替换后的字符串。

    import re
    
    content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
    content = re.sub('d+', '', content)
    print(content)
    Extra stings Hello  World_This is a Regex Demo Extra stings
    import re
    
    content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
    content = re.sub('(d+)', r'1 8910', content)   
    print(content)
    
    # r'1 8910' 代表前面group1, 
    # Raw String, 使用r表示,代表正则表达式是怎样,原生字符串就是怎样,完全不用考虑正则表达式之外的转义
    # r'[0-9]$' == '^[0\-9]$'
    Extra stings Hello 1234567 8910 World_This is a Regex Demo Extra stings
     

    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)
    <_sre.SRE_Match object; span=(0, 40), match='Hello 1234567 World_This
    is a Regex Demo'>


  • 相关阅读:
    Unity 3(一):简介与示例
    MongoDB以Windows Service运行
    动态SQL中变量赋值
    网站发布IIS后堆栈追踪无法获取出错的行号
    GridView Postback后出错Operation is not valid due to the current state of the object.
    Visual Studio 2010 SP1 在线安装后,找到缓存在本地的临时文件以便下次离线安装
    SQL Server 问题之 排序规则(collation)冲突
    IIS 问题集锦
    linux下安装mysql(ubuntu0.16.04.1)
    apt-get update 系列作用
  • 原文地址:https://www.cnblogs.com/ecwork/p/7442273.html
Copyright © 2011-2022 走看看