zoukankan      html  css  js  c++  java
  • Python学习笔记013_正则表达式

    Python中的正则表达式是通过 re 模块实现的.

    通配符 .  表示除了换行以外的任何字符; 

    编写正则表达式时使用  r're'  , r + 正则表达式内容

    >>> import re
    >>> 
    >>> re.search(r'Fish.','I love FishC.com!')
    <_sre.SRE_Match object; span=(7, 12), match='FishC'>
    >>> # 如果要匹配 . 本身  使用  .

    d 表示 数字字符

    >>> re.search(r'd','I love FishC.com 123 !')
    <_sre.SRE_Match object; span=(17, 18), match='1'>
    >>>

    [] 匹配到中括号里面的任何一个字符,都算匹配成功

    >>> re.search(r'[aeiou]','I love FishC.com !')
    <_sre.SRE_Match object; span=(3, 4), match='o'>
    >>> 

    []中可以使用 - 表示范围

    >>> re.search(r'[a-z]','I love FishC.com !')
    <_sre.SRE_Match object; span=(2, 3), match='l'>
    >>> 

    {m,n} 被匹配的次数区间

    >>> re.search(r'ab{2,3}c','aabbccddacc')
    <_sre.SRE_Match object; span=(1, 5), match='abbc'>
    >>> 

    匹配IP

    >>> 
    >>> # 匹配IP ,从实践可以看出几个或在一起,第一个匹配上就不再匹配第二个
    >>> 
    >>> 
    >>> re.search(r'((25[0-5]|2[0-4]d|1d{2}|[1-9]d|d).){3}(25[0-5]|2[0-4]d|1d{2}|[1-9]d|d)','192.168.1.12')
    <_sre.SRE_Match object; span=(0, 12), match='192.168.1.12'>
    >>> 

    小甲鱼Python3 正则表达式 官方文档翻译讲解地址

    Python3 如何优雅地使用正则表达式(详解一)http://bbs.fishc.com/thread-57073-1-1.html

    Python3 如何优雅地使用正则表达式(详解二)http://bbs.fishc.com/thread-57188-1-1.html

    Python3 如何优雅地使用正则表达式(详解三)http://bbs.fishc.com/thread-57207-1-1.html

    Python3 如何优雅地使用正则表达式(详解四)http://bbs.fishc.com/thread-57271-1-1.html

    Python3 如何优雅地使用正则表达式(详解五)http://bbs.fishc.com/thread-57317-1-1.html

    Python3 如何优雅地使用正则表达式(详解六)http://bbs.fishc.com/thread-57362-1-1.html

    Python3 如何优雅地使用正则表达式(详解七)http://bbs.fishc.com/thread-57438-1-1.html

    Python3 正则表达式特殊符号及用法(详细列表)http://bbs.fishc.com/thread-57691-1-1.html

    的作用:

      1) 将普通字符变成特殊字符,   d

          2)  解除元字符的特殊功能,    .

          3) 引用序号对应的子组所匹配的字符串  1-99 ;如果序号以0开头或者是3位数字长度,那么不会被应用于对应的子组,而是用于匹配八进制数字所表示的ASCII码值对应的字符

    >>> 
    >>> re.search(r'(FishC)1','I love FishC.com')
    >>> re.search(r'(FishC)1','I love FishCFishC.com')
    <_sre.SRE_Match object; span=(7, 17), match='FishCFishC'>
    >>> 

    [] 讲解:
      它是一个字符类,除了几个特殊的字符,其它字符在里面都是普通字符,比如 - 是特殊字符  . 是普通字符

          [ ] ,匹配 本身 ,[a-z-], -放在最后表示匹配-自身  [^a-z] 取反(匹配的是除了a-z之外的),如果[a-z^]表示匹配a-z和^本身

    >>> re.search(r'.', 'I love FishC.com')
    <_sre.SRE_Match object; span=(0, 1), match='I'>
    >>> re.search(r'[.]', 'I love FishC.com')
    <_sre.SRE_Match object; span=(12, 13), match='.'>
    >>> 
    >>> # 下面我们使用 findall 函数
    >>> #findall函数是返回所有匹配的字符串,并生成列表返回
    >>> re.findall(r'[a-z]','FishC.com')
    ['i', 's', 'h', 'c', 'o', 'm']
    >>> 

    * 等价于 {0,}   ,    + 等价于 {1,}   ,    ? 等价于 {0,1}

    建议使用 *,+,?  他们的效率 比 {}高

    贪婪 & 非贪婪 

    Python的正则表达式默认是启用了贪婪的模式 

    贪婪就是只要在符合的条件下尽可能多的匹配 

    >>> 
    >>> s = '<html><title> I love FishC.com</title></html>'
    >>> re.search(r'<.+>',s)
    <_sre.SRE_Match object; span=(0, 45), match='<html><title> I love FishC.com</title></html>'>
    >>> 
    >>> # 启用非贪婪 , 在表示重复的元字符后面加问号?,这时的?不代表0或1次
    
    >>> re.search(r'<.+?>',s)
    <_sre.SRE_Match object; span=(0, 6), match='<html>'>
    >>> 

      匹配一个单词的边界,单词被定义为 Unicode的字母数字或下划线字符

    B 与 相反

    >>> re.search(r'FishC','I love FishC.com FishC_com FishC')
    <_sre.SRE_Match object; span=(7, 12), match='FishC'>
    >>> re.findall(r'FishC','I love FishC.com FishC_com FishC')
    ['FishC', 'FishC']
    >>> 

    s 匹配Unicode中的空白字符(包括 fv)以及其它空白字符

    w 匹配任何Unicode中定义的单词字符

    >>> 
    >>> re.findall(r'w','我爱你 (I love you!)')
    ['', '', '', 'I', 'l', 'o', 'v', 'e', 'y', 'o', 'u']
    >>> 

    编译正则表达式

    如果需要重复地使用某个正则表达式,那么可以先将该正则表达式编译成模式对象

    使用 re.compile()方法来编译...

    >>> p = re.compile(r'[a-z]')
    >>> type(p)
    <class '_sre.SRE_Pattern'>
    >>> p.search('I love FishC.com')
    <_sre.SRE_Match object; span=(2, 3), match='l'>
    >>> p.findall('I love FishC.com')
    ['l', 'o', 'v', 'e', 'i', 's', 'h', 'c', 'o', 'm']
    >>> 

    编译标志

    编译标志让你可以修改正则表达式的工作方式。在re模式下,编译标志均有两个名字:完整名和缩简写

    标志                          含义

    ASCII,A                    使得转义符号入w,,s和d 只能匹配ASCII字符

    DOTALL,S           使得.匹配任何符号,包括换行符

    IGNORECASE,I          匹配时不区分大小写

    LOCALE,L                 支持当前的语言(区域)设置

    MULTILINE,M           多行匹配,影响 ^ $

    VERBOSE,X(for 'extended')   启用详细的正则表达式

    search()方法, 返回的是一个 匹配对象

    可以使用匹配对象的相关方法获取匹配的内容, 如果里面有 子元组 ,group(n) ,可以获取里面的子元组内容

    >>> 
    >>> result = re.search(r' (w+) (w+)','I love FishC.com')
    >>> type(result)
    <class '_sre.SRE_Match'>
    >>> result.group()
    ' love FishC'
    >>> result.group(1)
    'love'
    >>> result.group(2)
    'FishC'
    >>> result.start()
    1
    >>> result.end()
    12
    >>> result.span()
    (1, 12)
    >>> 

    findall()方法 在没有子组的情况下,返回匹配到的内容组成的列表,如果里面包含了子组,就会把子组内容单独返回,如果有多个子组,作为元组的形式返回各个子组内容

    (?...)  (?开头的表示为正则表达式的扩展语法 

    (?:...)  , 非捕获组 ,即该子组匹配的字符串无法从后边获取

    #不是我们想要的结果
    >>> re.findall(r'((25[0-5]|2[0-4]d|1d{2}|[1-9]d|d).){3}(25[0-5]|2[0-4]d|1d{2}|[1-9]d|d)','192.168.1.12')
    [('1.', '1', '12')]
    >>> # 是我么你想要的结果,改为非捕获组
    >>> re.findall(r'(?:(?:25[0-5]|2[0-4]d|1d{2}|[1-9]d|d).){3}(?:25[0-5]|2[0-4]d|1d{2}|[1-9]d|d)','192.168.1.12')
    ['192.168.1.12']
    >>> 
    ----------- 赠人玫瑰,手有余香     如果本文对您有所帮助,动动手指扫一扫哟   么么哒 -----------


    未经作者 https://www.cnblogs.com/xin1006/ 梦相随1006 同意,不得擅自转载本文,否则后果自负
  • 相关阅读:
    iOS的一些面试题分析总结(1)
    iOS的一些面试题分析总结(0)
    iOS页面间传值的一些方式总结
    自定义UIButton
    iOS查看3D效果的手势交互
    关于php得到参数数据
    ios安装ipa与安卓安装apk
    听说程序员想当就能当?
    W5100S、W5500、W5100差异对比
    annot read lifecycle mapping metadata for artifact org.apache.maven.plugins:maven-clean-plugin:maven
  • 原文地址:https://www.cnblogs.com/xin1006/p/5744633.html
Copyright © 2011-2022 走看看