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")

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




    
    


     
     




     


  • 相关阅读:
    思考--连续的还是跳跃的?(二)
    方法学导论--by 有只茄子
    时空、维度,以及其他(一)
    处理问题的方法--抽象和特例化
    tomcat server 152主机.xml
    java怎么重写覆盖Spring Bean的几种方式
    maven上传jar到私服
    sql_mode=only_full_group_by
    spring何时创建bean
    mysql 快速备份数据库
  • 原文地址:https://www.cnblogs.com/kenD/p/9489317.html
Copyright © 2011-2022 走看看