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

    1.正则表达式

      正则,只跟字符串相关,就是匹配字符串内容的一种规则。

      正则主要有两部分组成,要查找字符的类型,以及要查找字符的数量。(自己的理解)

      字符的类型:(相当于你要找的部分内容)

      

    元字符
     
    匹配内容
    匹配除换行符以外的任意字符
    w 匹配字母或数字或下划线
    s 匹配任意的空白符
    d 匹配数字
    匹配一个换行符
    匹配一个制表符
     匹配一个单词的结尾
    ^ 匹配字符串的开始
    $ 匹配字符串的结尾
    W
    匹配非字母或数字或下划线
    D
    匹配非数字
    S
    匹配非空白符
    a|b
    匹配字符a或字符b
    ()
    匹配括号内的表达式,也表示一个组
    [...]
    匹配字符组中的字符
    [^...]
    匹配除了字符组中字符的所有字符

      代表数量的量词:(相当于你要找的部分内容对应的个数)

        

    量词
    用法说明
    * 重复零次或更多次
    + 重复一次或更多次
    ? 重复零次或一次
    {n} 重复n次
    {n,} 重复n次或更多次
    {n,m} 重复n到m次

      示例:

      'dd+w{3,6}p'   这个正则表达式代表的是:以d开头,后边是数字,数量是1个或者多个,后边是字母、数字、下划线,数量是3-6个,然后以一个p结尾。

      备注:这里都是默认为贪婪模式,数量能找到满足条件的多个,就找多个,非贪婪模式的是在表达数字的后边加‘?’号。如右:'dd+?w{3,6}?p'

      代表要查找字符位置的符号:

      ^ 和 $ : ^代表在字符串的开头出现,$ 代表在字符串的末尾出现。

      示例 

      string = '海燕海东海西'  

      ^海.   会匹配到 开头的‘海燕’  ,全部的意思是:匹配开头是海这一个字,后边跟一个除换行符之外的一个字符。

      海.$   会匹配到结尾的‘海西’ ,全部的意思是 :匹配结尾的海+一个除换行符之外的一个字符

      字符集[][^]

      [ ]  表示这一个位置可能出现的字符,注意是一个位置,表示多个位置的话,可以是 [ ]*,或者 [ ]+ 等[ ]后边跟量词

      [ ^ ]  表示取非,这一个位置可能出现的字符除了括号内的,

      

       分组 ()与 或 |

      示例:

      () 表示把一些字符看成一个整体,  | 是或的意思。

      ([1-9]d{16}[0-9x]|[1-9]d{14})   表示先匹配[1-9]d{16}[0-9x]如果没有匹配上就匹配[1-9]d{14}

    2.Python 下的正则表达式—— re 模块 

      re模块常用方法:findall、search、 match、 split、 sub、

      re.findall(pattern,) 

      查找满足条件的字符串,返回一个列表,元素是每一个找到的子字符串,

    1 示例:
    2 str = 'fhsjdhal66478636666guy66666hhfieyhf'
    3 ret5 = re.findall('d{4,6}?',str)
    4 print(ret5)

    结果:
    [['6647', '8636', '6666']] # 此处是非贪婪模式

      findall中有个分组优先的原则:

    # 如果没有分组,是这样子的:
    str = '11512319890965443xhfauh630289768776545678ucufy'
    ret5 = re.findall('[0-9]d{5}d{8}d{3}[0-9x]',str)    
    # ret5 = re.findall(r'[1-9]d{16}[0-9x]',str)
    print(ret5)
    
    结果是:
    >>> ['11512319890965443x', '630289768776545678']
    
    假如我分组了,就会返回组里边的信息,
    str = '62012319890965443xhfauh630289768776545678ucufy'
    ret5 = re.findall('[0-9]d{5}(d{8})d{3}[0-9x]',str)
    # ret5 = re.findall(r'[1-9]d{16}[0-9x]',str)
    print(ret5)
    
    结果是:
    >>> ['19890965', '76877654']
    
    其实其他位置的也匹配到了,只是没有显示出来而已。

      re.resarch()

      在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,通过.group()方法调用。

    1 ret = re.search('a', 'eva egon yuan').group()
    2 print(ret) 
    3 #结果 : 'a'

      re.math()

      在字符串开始处进行匹配,如果不在开头,则会报错,如找到,返回的跟search一样。

    1 ret = re.match('a', 'abc').group()  
    2 print(ret)
    3 
    4 #结果 : 'a'

       re.finditer() 

      返回一个存放匹配结果的迭代器

    1 import re
    2 ret = re.finditer('d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
    3 print(ret)  # <callable_iterator object at 0x10195f940>
    4 print(next(ret).group())  #查看第一个结果
    5 print(next(ret).group())  #查看第二个结果
    6 print([i.group() for i in ret])  #查看剩余的左右结果

      re.split  返回一个切割之后的列表。

      ret = re.split('[ab]', 'abcd')

      # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割 print(ret) # ['', '', 'cd']   注意这里  

      split的优先级查询

    ret=re.split("d+","eva3egon4yuan")
    print(ret) 
    
    #结果 : ['eva', 'egon', 'yuan']
    
    ret=re.split("(d+)","eva3egon4yuan")
    print(ret)
     
    #结果 : ['eva', '3', 'egon', '4', 'yuan']
    
    #在匹配部分加上()之后所切出的结果是不同的,
    #没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
    #这个在某些需要保留匹配部分的使用过程是非常重要的。

      re模块其他的方法:

      sub 替换 、compile()编译成一个对象

    ret = re.sub('d', 'H', 'eva3egon4yuan4', 1)
    #将数字替换成'H',参数1表示只替换1个
    print(ret) #evaHegon4yuan4
    
    ret = re.subn('d', 'H', 'eva3egon4yuan4')
    #将数字替换成'H',返回元组(替换的结果,替换了多少次)
    print(ret)
    
    obj = re.compile('d{3}')  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
    ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
    print(ret.group()) 
     #结果 : 123
    
    
    

      

      

      

  • 相关阅读:
    队列加分项
    队列课下作业
    20162306 2017-2018-1 《程序设计与数据结构》第7周学习总结
    20162306 2017-2018-1 《程序设计与数据结构》第5周学习总结
    20162306陈是奇 第一次实验报告
    20162306 2017-2018-1 《程序设计与数据结构》第3周学习总结
    20162306 陈是奇 2017-2018-1 《程序设计与数据结构》第1周学习总结
    数据库实验补充
    2017-2018-1 20162304 实验二 树
    队列加分项
  • 原文地址:https://www.cnblogs.com/fengqing89/p/7301120.html
Copyright © 2011-2022 走看看