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

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

     

    开源中国提供的正则表达式测试工具 http://tool.oschina.net/regex/

     

    match() 

    正则常用的匹配方法 --match(),向它传入要匹配的字符串以及正则表达式,就可以检测这个正则表达式是否匹配字符串

    match()方法会常是从字符串的起始位置匹配,如果匹配,就返回匹配成功的结果,如果不匹配,就返回None

     

    import re   #正则表达式模块 

    content = 'Hello 123 4567 World_This is a Regex Demo'

    print(len(content))

    result = re.match('^Hellosdddsd{4}sw{10}',content)      

    print(result)

    print(result.group())

    print(result.span())

     

    这里首先声明了一个字符串 content,其中包括英文、空白字符、数字等

    ^Hellosdddsd{4}sw{10}

    用它来匹配字符串,开头的^是匹配字符串的开头,也就是以hello开头,s匹配空白字符,用来匹配目标字符串的空格,d匹配数字,3个d匹配123

    然后再一个s匹配空格,后面 4567用4个d匹配,但是这么写比较繁琐,所以后面可以跟{4}以代表匹配签名的规则4次,也就是4个数字,然后再一个空格,

    最后以w{10}匹配10个字母以及下划线,我们注意到,这里并没有把目标字符串匹配完,不过这样依然可以匹配,只不过匹配结果段一点

     

    在match()方法中,第一个参数传入正则表达式,第二个参数传入了要匹配的字符串

    打印输出结果,可以看到结果是SRE_Match对象,这证明匹配成功,该对象有两个方法,group()方法可以打印输出匹配到的内容,span()方法可以输出匹配范围,结果是(0,25)

     

    匹配目标

    匹配时候可以使用()括号将想提取的子字符串括起来,()实际上标记了一个子表达式的开始和结束位置,被标记的每个子表达式会依次对应每一个分组,调用group()方法方法传入

    分组的索引即可获取提取结果

    import re
    content = 'Hello 1234567 World_this is a Regex Demo'
    result = re.match('^Hellos(d+)sWorld',content)
    print(result) #匹配结果是SRE_Match对象,证明匹配成功
    print(result.group()) #打印出完整的匹配内容
    print(result.group(1)) #通过索引打印(1)里面匹配的内容,如果后面还要(),可以用group(2)
    print(result.span()) #打印匹配的范围

    通用匹配

    上面的正则表达式比较复杂,出现空白就用s,数字就用d,这样工作量比较大,我们还可以用.*(点星)来匹配, .(点)可以匹配任意字符(除换行符),*(星代表匹配前面字符无限次)

    import re
    content = 'Hello 1234567 World_this is a Regex Demo'
    result = re.match('^Hello.*Demo$',content) #从Hello开始,Demo结束,.*匹配中间所有字符 $代表结束
    print(result.group())
    print(result.span())

    贪婪匹配与非贪婪
    使用通用匹配.*时,有时候可能匹配的不是我们想要的结果
    import re
    content = 'Hello 1234567 World_this is a Regex Demo'
    result = re.match('^Hello.*(d+).*Demo$',content)
    print(result.group(1)) #打印结果是7,没有得到中间的1234567
    print(result.span())

    --------------------------------------------------------------
    #使用非贪婪匹配.*?
    import re
    content = 'Hello 1234567 World_this is a Regex Demo'
    result = re.match('^Hello.*?(d+).*Demo$',content)
    print(result.group(1))   #.*?(d+) 打印结果是1234567
    print(result.span())

    贪婪匹配匹配的是尽可能多的字符,非贪婪匹配就是尽可能匹配少的字符,.*?匹配到Hello后面的空白字符时,再往后就是数字,交给d+来匹配
    所以匹配的时候尽量用.*?来匹配,如果是在字符串结尾,.*?可能匹配不到内容,而.*可以



    修饰符
    正则表达式可以包含一些可选标志修饰符来控制匹配的模式,修饰符被指定为一个可选的标志
    
    
    import re
    content = '''Hellow 1234567 World_this
    is a Regex Demo'''
    result = re.match('^He.*?(d+).*?Demo$',content,re.S) #如果不加re.S,运行会直接报错,因为.*?匹配不了换行,
    print(result) #re.S是让.可以匹配包括换行符在内的所有字符
    print(result.group(1))

    re.I 使匹配对大小写不敏感
    re.L 使本地化识别(locale-aware)匹配
    re.M 多行匹配,影响^和$
    re.S     使.匹配包括换行符在内所有字符
    re.U 根据Unicode字符集解析字符,这个标志影响w W  和B
    re.X 该标志通过基于你更良好的格式以便你将正则表达式写的更易于理解 #在网页匹配时常用re.S re.I


    转义匹配
    如果正则匹配目标字符串里面包含. 就需要用到转义字符
    import re
    content = '(百度)www.baidu.com'
    result = re.match('(百度)www.baidu.com$',content) #当匹配时遇到特殊字符,就要在前排加转义一下
    print(result)
    print(result.group())
    Search()
    macth()方法是从字符串开头开始匹配,如果开头不匹配,整个结果都失败,因为macth()使用是需要考虑到开头的内容,所以匹配时不太方面
    更适合用来检测整个字符串是否符合

    search方法匹配时会扫描整个字符串,然后返回第一个成功匹配的结果,也就是说,正则表达式可以是字符串的一部分,search匹配时会依次扫描
    字符串,直到找到第一个符合规则的字符串,然后返回匹配内容,如果搜完还没找到,就返回None,匹配时为了方便,尽可能使用search

    findall()
    findall方法会搜索整个字符串,然后返回匹配正则表达式所有内容,如果只是提取第一个内容,可以用search(),提取多个内容可以用findall()

    Sub()

    除了使用正则表达式提取信息外,还可以用它修改文本,比如想把一串文本中的所有数字都去掉,只用字符串的replace()方法,太繁琐了,这时可以借助sub()方法

    import re

    content = '5S6D7ASD677ASD57S'

    content = re.sub('d+','',content)        #第一个参数传入d+匹配所有的数字,第二个参数‘’ 是替换成的字符串,第三个参数是原字符串

    print(content)

    compile()

    compile()是将正则字符串编译成正则表达式对象,以便在后面的匹配中用到

    import re
    content1 = '2016-12-15 12:00'
    content2 = '2016-12-17 12:55'
    content3 = '2016-12-22 13:21'
    pattern = re.compile('d{2}:d{2}') #匹配到日期后的时间
    result1 = re.sub(pattern,'',content1) #使用sub方法去掉时间
    result2 = re.sub(pattern,'',content2)
    result3 = re.sub(pattern,'',content3)
    print(result1,result2,result3) #打印日期,只有年份

    然后可以用compile方法将正则表达式编译成一个对象,以便复用,还可以传入修饰符,这样在用别的方法时候就不用传了,相当于给正则做了一层封装

    just do it .
  • 相关阅读:
    DataAnnotations
    使用BizTalk实现RosettaNet B2B So Easy
    biztalk rosettanet 自定义 pip code
    Debatching(Splitting) XML Message in Orchestration using DefaultPipeline
    Modifying namespace in XML document programmatically
    IIS各个版本中你需要知道的那些事儿
    关于IHttpModule的相关知识总结
    开发设计的一些思想总结
    《ASP.NET SignalR系列》第五课 在MVC中使用SignalR
    《ASP.NET SignalR系列》第四课 SignalR自托管(不用IIS)
  • 原文地址:https://www.cnblogs.com/Mickey-7/p/9812426.html
Copyright © 2011-2022 走看看