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

    正则表达式是什么?  

    正则表达式本身和python没有什么关系, 就是匹配字符串的一种规则

    正则是一种独立的规则,独立的语言, 只和字符串打交道

    在线测试工具 http://tool.chinaz.com/regex/

    正则表达式可以做什么?

    1.把一个文件中所有的手机号都找出来 (*** 从大段的文字中找到符合规则的)
    open打开文件
    读文件 str
    从一长串的字符串中找到所有11位数字

    2.注册账号的时候需要输入手机号 (*** 判断某个字符串是否完全符合规则)
    验证手机号是否合法
    给手机号发送验证码
    用户填写验证码
    完成注册

    正则表达式作用(****非常重要****):
    1.从大段的文字中找到符合规则的内容(对正则的要求很高)
    爬虫: 从网页的字符串中获取你想要数据
    日志分析(数据分析)
    什么是日志: 在什么时间点在哪花多少钱就是一条日志
    例如: 2018-8-12 10:00:00 楼下早点摊 $3.00

    2.判断某个字符串是否完全符合规则
    表单验证:手机号,qq号,邮箱,银行卡,身份证,密码

    字符组:[字符组]
    同一个位置可能出现的各种字符组成的一个字符组, 在正则表达式中用[]表示
    字符分很多类, 比如数字, 字母, 标点等
    正则:    [0123456789]           
    待匹配字符:    5            
    匹配结果:      True          
    说明: 枚举所有的字符,字符组里任意一个字符和待匹配字符相同, 都认为是可以匹配
    
    正则:    [012345]           
    待匹配字符:    a            
    匹配结果:      False          
    说明:    由于字符组中没有"a"字符,所以不能匹配
    
    正则:    [0-9]           
    待匹配字符:    8            
    匹配结果:      True          
    说明:    [0-9]就和[0123456789]是一个意思
    
    正则:    [a-z]           
    待匹配字符:    b            
    匹配结果:      True          
    说明:    [a-z]表示所有小写字母
    
    正则:    [A-Z]           
    待匹配字符:    B            
    匹配结果:      True          
    说明:    [A-Z]表示所有大写字母                              
    
    
    *** 一个字符组只约束一个字符
    字符组:[] 写在中括号中的内容都可以出现在下面的某一个位置上
    [0-9] 匹配数字  还可以写[4-9] 都是从小到大的顺序 不能写[9-4]
    [a-z] 匹配小写字母
    [A-Z] 匹配大写字母
    A-Z 65-90 ascii码
    a-z 97-122 ascii码顺序 90-97之间还有一些其他的字符
    [a-zA-Z] 匹配出所有的大小写字母
    [a-zA-Z0-9]匹配大小写字母和数字
    [a-zA-Z0-9_]匹配数字字母下划线
    
    
    字符
    w 匹配数字字母下划线 word关键字[a-zA-Z0-9_]; \w的结果是w d 匹配数字 digit [0-9] s 匹配空格,回车,tab制表符 匹配一个tab 匹配回车 直接敲空格键 匹配一个空格 W 非数字字母下划线 D 匹配除了数字之外的 S 匹配除了空白之外的 [sS][dD][wW],是三组匹配所有的字符  表示单词的边界 k找到以k开头的单词 ing找到以ing结尾的单词
    ^ 开始符 匹配开头 只能出现在字符串的开始
    $ 结束符 匹配最后一个字符 只能出现在字符串的结尾
    ^ddddddddddd$ 验证电话号
    1dddddddddd
    1d{10} 10是约束d的 d直接重复10次
    .表示匹配除了 换行符 之外所有的字符 .代表1个字符
    []字符组 只要出现在中括号里的内容都可以被匹配(一个字符组只能匹配一个字符)
    [^] 只要不出现在中括号里的内容才可以被匹配 尖叫号^ 必须写在最前面
    有一些有特殊意义的元字符,进入字符组中,会恢复它原有意义
    放在字符组里现原形的有: . | [] () 这四个
    a|b 或 符合a规则的或者符合b规则的都可以被匹配
    如果a规则是b规则的一部分,并且a规则比b规则要苛刻/长, 把a写在前面
    () 表示分组 表示给几个字符加上量词约束的需求的时候用
    量词: ? + * {n} {n,} {n,m}
    {n}表示 这个量词之前的字符出现n 次
    {n,} 表示至少出现n 次
    {n,m} 表示出现 n 到 m 次
    ?表示匹配量词之前的字符出现 0次 或者 1次, d? 表示某个数字可有可无的时候
    +表示匹配量词之前的字符出现 1次 或者 多次 d+
    *表示匹配量词之前的字符出现 0次 或者 多次
    可以根据下图记忆 ? + *

    .^$的用法:
    正则: 海.
    待匹配字符: 海燕海娇海东
    匹配结果: 海燕海娇海东 匹配到了 3次 结果
    说明: 匹配所有"海." 的字符

    正则: ^海.
    待匹配字符: 海燕海娇海东
    匹配结果: 海燕 匹配到了 1次 结果
    说明: 从开头匹配"海."

    正则: 海.$
    待匹配字符: 海燕海娇海东

    匹配结果: 海东 匹配到了 1次 结果
    说明: 只匹配结尾的"海.$"

    * + ? {}的用法:
    正则: 李.? (.只表示一个字符)
    待匹配字符: 李杰和李莲英和李二棍子
    匹配结果: 李杰 李莲 李二 3个结果
    说明: ?表示重复 0次 或者 1次, 就是只匹配"李"后面一个任意字符

    正则: 李.*
    待匹配字符: 李杰和李莲英和李二棍子
    匹配结果: 李杰和李莲英和李二棍子 1个结果
    说明: *表示重复0次 或者 多次, 就是匹配"李"后面0个 或者 多个字符
    正则: 李.+
    待匹配字符: 李杰和李莲英和李二棍子
    匹配结果: 李杰和李莲英和李二棍子 1个结果
    说明: +表示重复1次 或 多次, 就是匹配"李"后面1个 或 多个任意字符
    正则: 李.{1,2}
    待匹配字符: 李杰和李莲英和李二棍子
    匹配结果: 李杰和 李莲英 李二棍
    说明: {1,2}匹配 1到2 次任意字符
    注意:前面的 * + ? 都是贪婪匹配,就是尽可能多的匹配, 后面加 ?号就变成了惰性匹配
    正则:  李.*?
    待匹配字符: 李杰和李莲英和李二棍子
    匹配结果: 李 李 李 3个结果
    说明: 惰性匹配 因为* 最少是0 所以就匹配到"李"后面的第0个
    正则:  李.+?
    待匹配字符: 李杰和李莲英和李二棍子
    匹配结果: 李杰 李莲 李二 3个结果
    说明: 惰性匹配 因为+ 最少是1 所以就匹配到"李"后面的第1个
    正则:  李.??
    待匹配字符: 李杰和李莲英和李二棍子
    匹配结果: 李 李 李 3个结果
    说明: 惰性匹配 因为? 最少是0 所以就匹配到"李"后面的第0个

    字符集 [] [^]的用法:
    正则: 李[杰莲英二棍子]*
    待匹配字符: 李杰和李莲英和李二棍子
    匹配结果: 李杰 李莲英 李二棍子
    说明: 表示匹配"李"字后面[杰莲英二棍子]的字符任意次
    正则: 李[杰莲英二棍子] (**一个字符组只能约束一个字符)
    待匹配字符: 李杰和李莲英和李二棍子
    匹配结果: 李杰 李莲 李二
    说明: 一个字符组只能约束一个字符
    正则: 李[^和]*
    待匹配字符: 李杰和李莲英和李二棍子
    匹配结果: 李杰 李莲英 李二棍子
    说明: 匹配一个不是"和"的字符任意次
    正则: [d]
    待匹配字符:456abcd3
    匹配结果: 4 5 6 3
    说明:匹配任意一个数字 4个结果
    正则: [d]+
    待匹配字符: 456abcd3
    匹配结果: 456 3
    说明: 匹配任意数字 2个结果
    分组()与 或|[^]的用法:
    身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部由数字组成,首位不能是0;
    如果是18位,则前17位全部是数字,末尾可能是数字或者X,下面用正则来表示一下

    正则:^[1-9]d{13,16}[0-9x]$
    待匹配字符:110101198001017032
    匹配结果:110101198001017032
    说明:
    表示可以匹配一个正确的身份证号

    正则:^[1-9]d{13,16}[0-9x]$
    待匹配字符:1101011980010170
    匹配结果: 1101011980010170
    说明:表示也可以匹配这串数字,但是这并不是一个正确的身份证号码,它是一个16位数
    正则:^[1-9]d{14}(d{2}[0-9x])?$
    待匹配字符:1101011980010170
    匹配结果:False
    说明:现在不会匹配错误的身份证号了,()表示分组,将d{2}[0-9x]分成一组就可以整体约束他们出现的次数为0-1次
    正则:^([1-9]d{16}[0-9x]|[1-9]d{14})$
    待匹配字符:110101198001017032
    匹配结果:110101198001017032
    明: 表示先匹配[1-9]d{16}[0-9x],如果没有匹配上就匹配[1-9]d{14}

    转译符:
    在正则表达式中,有很多有特殊意义的是元字符, 比如d和s等,如果在正则中匹配正常的"d"而不是"数字"就需要
    对""进行转义,变成"\"
    在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现,在字符串中也是有特殊意义,本身还需要转义.
    如果匹配一次"d",字符串就写成"\d",那么正则里就要写成"\\d",这样就太麻烦了.
    这时候我们就要用r"d",此时的正则是r"\d"就可以.

    正则: d
    待匹配字符: d
    匹配结果: False
    说明: 因为在正则表达式中 是有特殊意义的字符, 所以要匹配d本身,用d表达式无法匹配
    正则: \d
    待匹配字符: d
    匹配结果: True
    说明:转义 之后变成\, 就可以匹配
    正则: "\\d"
    待匹配字符: "\d"
    匹配结果: True
    说明: 如果在python中, 字符串中的""也需要转义,所以每一个字符串""又需要转义一次
    正则: r"\d"
    待匹配字符: r"d"
    匹配结果: True
    说明:在字符串之前加r, 让整个字符串不转义

    贪婪匹配:在满足匹配时, 匹配尽可能长的字符串, 默认情况下采用贪婪匹配
    正则:<.*>
    待匹配字符: <script>...<script>
    匹配结果: <script>...<script>
    说明: 默认是贪婪匹配,会匹配尽量长的字符串
    正则:<.*?>
    待匹配字符: <script>...<script>
    匹配结果: <script>
          <script>

    说明: 加上?把贪婪算法转成了非贪婪算法,会匹配尽可能短的字符串
    .*?x 匹配任意非换行符字符任意长度,直到遇到x 停止. 这里的x 就是>

    几个字符的组合关系:
    字符 或者 元字符 只约束一个字符
    字符+量词 约束一个字符连续出现的次数
    字符+量词+? 约束一个字符连续出现的最少次数
    字符+量词+?+x 约束一个字符连续出现量词范围

    关于字符串挪到 python中的转义问题:只需要在python里的表达式前加r
    print(r" ")
    print(r"\n")

    普通字符就表示一个正常的字符
    元字符表示它特殊的意义, 如果元字符转义,就失去了特殊意义
     
     
     




    
    


     
     




     


  • 相关阅读:
    IXmlSerializable With WCFData Transfer in Service Contracts
    Difference Between XmlSerialization and BinarySerialization
    Using XmlSerializer (using Attributes like XmlElement , XmlAttribute etc ) Data Transfer in Service Contracts
    Introducing XML Serialization
    Version Tolerant Serialization
    Which binding is bestWCF Bindings
    Data Transfer in Service Contracts
    DataContract KnownTypeData Transfer in Service Contracts
    Using the Message ClassData Transfer in Service Contracts
    DataContract POCO SupportData Transfer in Service Contracts
  • 原文地址:https://www.cnblogs.com/kenD/p/9489317.html
Copyright © 2011-2022 走看看