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

    一.re.match

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

    re.match函数尝试从字符串的开头开始匹配一个模式,如果匹配成功,返回一个匹配成功的对象,否则返回None。

    1.常规的匹配

    import re
    content = 'Hello 3232 4324 World_This is a Regex Demo'
    print(len(content))
    result = re.match('^Hellosd{4}sd{4}sw{10}.*mo$',content)
    print(result)
    print(result.group())# .group()不带参数,输出匹配的整个参数。
    print(result.span())# .span()输出匹配的范围。
    '''
    输出
    42
    <re.Match object; span=(0, 42), match='Hello 3232 4324 World_This is a Regex Demo'>
    Hello 3232 4324 World_This is a Regex Demo
    (0, 42)
    '''
    

    注释

    group()用法

    2.泛匹配

    .* 表示任意字符

    import re
    content = 'Hello 3232 4324 World_This is a Regex Demo'
    result = re.match('^Hello.*mo$',content)
    print(result)
    print(result.group())
    print(result.span())
    '''
    输出
    <re.Match object; span=(0, 42), match='Hello 3232 4324 World_This is a Regex Demo'>
    Hello 3232 4324 World_This is a Regex Demo
    (0, 42)
    '''
    

    3.匹配目标(分组)

    一般我们把匹配目标用小括号括起来,然后指定左右端点,就可以匹配到想要的字符。

    import re
    content = 'Hello 3232 4324 World_This is a Regex Demo'
    result = re.match('^Hellos(d{4})s(d+)s.*mo$',content)
    print(result)
    print(result.group(1))#第一个小括号括起来匹配的内容
    print(result.group(2))#第二个小括号括起来的内容
    print(result.span())
    
    '''
    <re.Match object; span=(0, 42), match='Hello 3232 4324 World_This is a Regex Demo'>
    3232
    4324
    (0, 42)
    '''
    

    4.贪婪匹配

    import re
    content = 'Hello 1234567 World_This is a Regex Demo'
    result = re.match('^He.*(d+).*mo$',content)
    print(result)
    print(result.group(1))
    print(result.span())
    '''
    输出
    <re.Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'>
    7
    (0, 40)
    '''
    

    因为.*表示任意字符,默认贪婪模式会匹配尽量多的任意字符,而d+至少要匹配一个数字,所以前面的.*一直匹配到最后一个数字之前。

    5.非贪婪模式

    import re
    content = 'Hello 1234567 World_This is a Regex Demo'
    result = re.match('^He.*?(d+).*mo$',content)
    print(result)
    print(result.group(1))
    print(result.span())
    '''
    输出
    <re.Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'>
    1234567
    (0, 40)
    '''
    

    .*?是非贪婪模式,匹配尽可能少字符。

    6.匹配换行符

    import re
    content = "Hello 123456 World_This 
     is a Regex Demo"
    result = re.match('^He.*?(d+).*mo$',content)
    print(result)
    
    """ 
    输出None
    """
    

    原因是.不能匹配换行符,添加re.S后才能匹配换行符。

    import re
    content = "Hello 1234567 World_This 
    is a Regex Demo"
    result = re.match('^He.*?(d+).*mo$',content,re.S)
    print(result)
    print(result.group(1))
    
    """ 
    <re.Match object; span=(0, 41), match='Hello 1234567 World_This 
    is a Regex Demo'>
    1234567
    """
    

    7.转义

    正则表达式中的许多特殊字符如果不做转义就无法被当成普通字符匹配到,会被认为是关键字使用,比如*.[ ]等。

    import re
    content = 'price $50.09'
    result = re.match('price $50.09',content) #字符串中有特殊字符$和.
    print(result)
    '''
    结果返回none,没匹配到。
    '''
    

    利用反斜杠进行转义,转义之后才能匹配

    import re
    content = 'price $50.09'
    result = re.match('price $50.09',content) 
    print(result
    '''
    <re.Match object; span=(0, 12), match='price $50.09'>
    '''
    

    总结

    尽量使用泛匹配模式,使用括号得到匹配目标,尽量使用非贪婪模式,使用re.S,因为HTML中有大量的换行符,这样就能匹配任意字符了。

    二.re.search

    re.search会搜索整个字符串,并返回第一个成功的匹配的字符串。

    import re
    content = "jlljjljh Hello 1234 World_This is a Regex Demo,Don't forget!$"
    result = re.match('Hello.*?(d+).*?',content)
    print(result)  #用match的话,匹配不到开头,返回None
    print("==========================")
    result = re.search('Hello.*?(d+).*?',content)
    print(result)
    print(result.group(1))
    '''
    None
    ==========================
    <re.Match object; span=(9, 19), match='Hello 1234'>
    1234
    '''
    

    小练习

    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>'''
        
     #匹配齐秦,往事随风   
    result1 = re.search('<li.*?active.*?singer="(.*?)">(.*?)</a>',html,re.S)
    if result1:
        print(result1.group(1), result1.group(2))
    
    #匹配 任贤齐 沧海一声笑
    result2 = re.search('<li.*?singer="(.*?)">(.*?)</a>',html,re.S)
    if result2:
        print(result2.group(1),result2.group(2))
    
    #匹配一路上有你
    result3 = re.search('<li.*?>(.*)</li>',html)
    print(result3.group(1))
    
    

    总结,为了方便能用search方法,就用search方法,尽量使用re.S,用非贪婪模式

    三.re.findall

    搜索字符串,以列表形式返回全部能匹配的字符,包括空匹配值。如果模式包含分组,将返回与分组匹配的文本列表。如果使用了不只一个分组,那么列表中的每项都是一个元组,包含每个分组的文本。

    demo1

    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('<a.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>',html,re.S)
    print(results)
    # 拆包思想
    for a,b,c,in results:
         print(a,b,c)
    '''
    输出
    [('2.mp3', '任贤齐', '沧海一声笑'), ('3.mp3', '齐秦', '往事随风'), ('4.mp3', 'beyond', '光辉岁月'), ('5.mp3', '陈慧琳', '记事本'), ('6.mp3', '邓丽君', '但愿人长久')]
    2.mp3 任贤齐 沧海一声笑
    3.mp3 齐秦 往事随风
    4.mp3 beyond 光辉岁月
    5.mp3 陈慧琳 记事本
    6.mp3 邓丽君 但愿人长久
    '''
    

    注:

    拆包思想

    demo2

    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.*?s*?(<a.*?>)?(w+)(</a>)?s*?</li>',html,re.S)
    print(results)
    for i in results:
        print(i[1])
    
    '''
    输出
    [('', '一路上有你', ''), ('<a href="2.mp3" singer="任贤齐">', '沧海一声笑', '</a>'), ('<a href="3.mp3" singer="齐秦">', '往事随风', '</a>'), ('<a href="4.mp3" singer="beyond">', '光辉岁月', '</a>'), ('<a href="5.mp3" singer="陈慧琳">', '记事本', '</a>'), ('<a href="6.mp3" singer="邓丽君">', '但愿人长久', '</a>')]
    一路上有你
    沧海一声笑
    往事随风
    光辉岁月
    记事本
    但愿人长久
    '''
    

    四.re.sub

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

    demo1

    import re
    content = 'Hello 3232 4324 World_This is a Regex Demo'
    content = re.sub('d+','',content)#把数字替换为空
    print(content)
    
    '''
    输出
    Hello   World_This is a Regex Demo
    '''
    

    demo2

    import re
    content = 'Hello 3232 4324 World_This is a Regex Demo'
    content = re.sub('d+','Replacement',content)#数字部分都替换成‘replacement’
    print(content)
    # 输出 Hello Replacement Replacement World_This is a Regex Demo
    

    五re.compile

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

    import re
    content = 'Hello 3232 4324 World_This is a Regex Demo'
    a = re.compile('^He.*?(d+).*mo$',re.S)#编译正则表达式对象。
    result = re.match(a,content)
    print(result.group(1))
    # 输出 3232
    

    参考

    参考

  • 相关阅读:
    libcurl库进行http通讯-开篇
    hdu4059The Boss on Mars 容斥原理
    “最大子序列和”算法 java
    Android 的事件传递机制,详解
    POJ
    hdu 5652 India and China Origins
    解决Swap file &quot;.ceshi.c.swp&quot; already exists!问题
    3DMax脚本插件--改动材质&amp;贴图名称
    ASP.NET MVC+Bootstrap 实现短信验证
    [从头学数学] 第176节 概率
  • 原文地址:https://www.cnblogs.com/lc-snail/p/13207136.html
Copyright © 2011-2022 走看看