zoukankan      html  css  js  c++  java
  • python re模块使用

    re.findall() 查找字符

    从字符串中找出符合模式的字符序列:findall(模式(正则表达式),目标字符串), 返回值为list类型,list元素为匹配出的各个字符串
    如:

    import re

    a = "java|python12988"    
    b =  re.findall("java", a)
    c = re.findall("d",a)
    print(b,c)

    结果

    ['java'] ['1', '2', '9', '8', '8']


    findall()函数还有第三个参数匹配模式,使用多个模式可以用'|'将各个模式分开,并且所有模式可以同时生效
    re.I

    import re

    language = "PythonC#JavaPHP"
    r = re.findall('c#', language)
    print(r)



    结果为

    []



    默认情况下区分大小写,所以'c#'并不能匹配出原字符串中的'C#'
    编辑第三个参数为re.I,使得匹配不受字母大小写影响

    import re

    language = "PythonC#JavaPHP"
    r = re.findall('c#', language, re.I)
    print(r)



    结果为

    ['C#']


    re.S

    import re

    language = "PythonC# JavaPHP"
    r = re.findall('c#.{1}', language, re.I) # "."匹配出除换行符外的所有字符
    print(r)



    结果为

    []



    加上模式re.S,可以改变"."的行为,将其匹配出换行符

    import re

    language = "PythonC# JavaPHP"
    r = re.findall('c#.{1}', language, re.I | re.S) # "."匹配除换行符外的所有字符
    print(r)



    结果为

    ['C# ']


    re.sub()正则替换,替换字符

    re.sub(要替换的字符,替换后字符,目标字符串,替换个数),返回值为替换后的字符串
    如:

    import re

    language = 'PythonC#JavaC#PHPC#'
    r = re.sub('C#','GO',language)
    print(r)



    结果为

    PythonGOJavaGOPHPGO



    上例中,替换个数默认为0,加入替换个数参数
    如:

    import re

    language = 'PythonC#JavaC#PHPC#'
    r = re.sub('C#','GO',language,count=1)
    print(r)

     

    结果为

    PythonGOJavaC#PHPC#

    结果就只把第一个C#给替换了
    效果与python的内置函数replace()一样

    re.sub()的第二个参数也可以传入一个函数
    如:

    import re

    def convert(value):
        print(value)

    language = 'PythonC#JavaC#PHPC#'
    r = re.sub('C#', convert, language)
    print(r)


    结果为打印出了三个match对象,span表示了匹配到的字符的位置

    <_sre.SRE_Match object; span=(6, 8), match='C#'>
    <_sre.SRE_Match object; span=(12, 14), match='C#'>
    <_sre.SRE_Match object; span=(17, 19), match='C#'>
    PythonJavaPHP


    说明'C#'被匹配到了三次,每次都会调用convert函数,由于该函数没有返回值,所以返回的字符串的'C#'被去掉了
    改写上例,由于value是个对象,所以可以调用value的group()方法获得所要匹配的'C#'

    import re

    def convert(value):
        matched = value.group()
        return '!!' + matched + '!!'

    language = 'PythonC#JavaC#PHPC#'
    r = re.sub('C#', convert, language)
    print(r)


    结果'C#'被成功替换成了'!!C#!!':

    Python!!C#!!Java!!C#!!PHP!!C#!!


    由于re.sub()的第二个参数可以传入一个函数,所以可以对字符串进行各种复杂的操作
    例如:
    将字符串'ABC24525DEF22698'中所有小于等于4的数字替换成0,大于4的数字替换成9,就可以编辑convert函数实现这个功能

    import re

    def convert(value):
        matched = value.group()
        if int(matched) <= 4:
            return '0'
        else:
            return '9'

    language = 'ABC24525DEF22698'
    r = re.sub('d', convert, language)
    print(r)



    打印结果为:

    ABC00909DEF00999


    将函数作为参数传入另一个函数是函数式编程
    re.match()和re.search()

    re.match()从字符串的起始位置匹配,若起始位置不符合正则表达式,则返回空
    re.search()搜索整个字符串,返回第一个匹配的结果

    两个函数若都能匹配到结果,那么返回的结果也是一个match对象
    match对象的方法除了有group()之外还有span()方法,可以返回匹配结果的位置

    而re.findall()方法就是把所有的匹配结果返回

    1. match()方法, 从字符串头部开始匹配

    import re

    content = 'The 123456 is my one phone number.'
    print(len(content)) #字符串长度
    result = re.match(r'^Thesd+sw*', content) #使用match匹配, 第一个参数为正则表达式, 第二个为要匹配的字符串
    print(result)
    print(result.group()) #输出匹配内容
    print(result.span()) #输出匹配内容的位置索引

    结果:

    34
    <_sre.SRE_Match object; span=(0, 13), match='The 123456 is'>
    The 123456 is
    (0, 13)


    2. 匹配目标

    import re

    content = 'The 123456 is my one phone number.'
    print(len(content)) #字符串长度
    result = re.match(r'^Thes(d+)sis', content) #使用match匹配, 第一个参数为正则表达式, 第二个为要匹配的字符串
    print(result)
    print(result.group()) #输出匹配内容
    print(result.group(1)) #输出第一个被()包裹的内容
    print(result.span()) #输出匹配内容的位置索引


    结果:

    34
    <_sre.SRE_Match object; span=(0, 13), match='The 123456 is'>
    The 123456 is
    123456
    (0, 13)


    在正则表达式中用()括起来可以使用group()输出, 若有n个(), 那么可以表示为group(n), 输出第n个括号匹配的内容.
    3.通用匹配

    import re

    content = 'The 123456 is my one phone number.'
    result = re.match(r'^The.*number.$', content) #使用match匹配, 第一个参数为正则表达式, 第二个为要匹配的字符串
    print(result)
    print(result.group()) #输出匹配内容
    print(result.span()) #输出匹配内容的位置索引


    结果:

    <_sre.SRE_Match object; span=(0, 34), match='The 123456 is my one phone number.'>
    The 123456 is my one phone number.
    (0, 34)


    其中 . 表示匹配任意字符, *表示匹配前面字符无限次.
    4.贪婪与非贪婪

    import re

    content = 'The 123456 is my one phone number.'
    print('贪婪匹配:')
    result = re.match(r'^The.*(d+).*', content) #使用match匹配, 第一个参数为正则表达式, 第二个为要匹配的字符串
    print(result.group()) #输出匹配内容
    print('result = %s'%result.group(1)) #输出第一个被()包裹的内容
    print('-'*20)
    print('非贪婪匹配:')
    result = re.match(r'^The.*?(d+).*', content)
    print(result.group())
    print('result = %s'%result.group(1))


    结果:

    贪婪匹配:
    The 123456 is my one phone number.
    result = 6
    --------------------
    非贪婪匹配:
    The 123456 is my one phone number.
    result = 123456


    5.修饰符 re.S

    import re

    content = '''The 123456 is
    one of my phone.
    '''
    result = re.match('^The.*?(d+).*?phone.', content, re.S)
    if result:
        print(result.group(1))
    else:
        print('result = None')
    result2 = re.match('^The.*?(d+).*?phone.', content)
    if result2:
        print(result2.group(1))
    else:
        print('result2 = None')


    结果:

    123456
    result2 = None


    由于加上re.S参数后, 通配符 . 将可以匹配换行符, 所以result不为空, result2为空. 出了re.S, 还有许多修饰符如, re.I: 使用匹配时忽略大小写.
    6.转义匹配

    import re

    content = '(百度)www.baidu.com'
    result = re.match('(百度)www.baidu.com', content)
    result2 = re.match('(百度)www.baidu.com', content)
    if result:
        print(result.group())
    else:
        print('result = None')
    if result2:
        print(result2.group())
    else:
        print('result2 = None')


    结果:

    result = None
    (百度)www.baidu.com


    由于()属于正则表达式的特殊字符, 因此在需要匹配()时, 需要加上转义字符’’.
    7.search()方法, 与match()方法不同, 不需要从头部开始匹配

    import re

    content = 'Other The 123456 is my one phone number.'
    result = re.search('The.*?(d+).*?number.', content)
    print(result.group())


    结果:

    The 123456 is my one phone number.

    8.findall()方法, match()和search()都是返回匹配到的第一个内容就结束匹配, 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-veiw="5">
    <a href="/6.mp3" singer="邓丽君">但愿人长久</a>
    </li>
    </ul>
    </div>
    '''

    result = re.findall('<li.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>', html, re.S)
    if result:
        print(result)
        for res in result:
            print(res[0], res[1], res[2])



    [('/2.mp3', '任贤齐', '沧海一声笑'), ('/3.mp3', '齐秦', '往事随风'), ('/4.mp3', 'beyond', '光辉岁月'), ('/5.mp3', '程慧玲', '记事本'), ('/6.mp3', '邓丽君', '但愿人长久')]
    /2.mp3 任贤齐 沧海一声笑
    /3.mp3 齐秦 往事随风
    /4.mp3 beyond 光辉岁月
    /5.mp3 程慧玲 记事本
    /6.mp3 邓丽君 但愿人长久


    9.sub()方法, 去除匹配的字符

    第二个参数是两个’,表示吧’d+ 匹配的内容替换成空,如果写sub(’d+’, ‘-’), 则把匹配的内容替换成 -。

    import re

    content = '54abc59de335f7778888g'
    content = re.sub('d+', '', content)
    print(content)

    结果:

    abcdefg

        1

    10.compile()

    import re

    content1 = '2016-1-1 12:01'
    content2 = '2017-1-1 12:02'
    content3 = '2018-1-1 12:03'

    pattern = re.compile('d{2}:d{2}')
    result1 = re.sub(pattern, '', content1)
    result2 = re.sub(pattern, '', content2)
    result3 = re.sub(pattern, '', content3)
    print(result1, result2, result3)


    结果:

    2016-1-1  2017-1-1  2018-1-1

    在需要匹配相同正则表达式情况下, 事先定义一个compile可以简化代码量, 同时compile中也可以使用修饰符r.S等.

  • 相关阅读:
    C#&nbsp;Andriod&nbsp;AES&nbsp;加密算法
    微软企业库的&nbsp;注入和依赖&amp;nbs…
    锐捷交换机RG-3760-24 的简单配置与VLAN搭建
    TCP-IP and Advanced Topics 课程总结与报告
    Network Security Threats
    Multicast Routing
    OpenFlow, SDN, and NFV
    Mobile IP
    数据结构:树的来源与定义
    TCP Congestion Control
  • 原文地址:https://www.cnblogs.com/lisa2016/p/11246191.html
Copyright © 2011-2022 走看看