zoukankan      html  css  js  c++  java
  • Day24--Python--常用模块03--正则表达式

    正则表达式是对字符串操作的⼀种逻辑公式. 我们⼀般使⽤正则表达式对字符串进⾏匹配和过滤.

    使⽤正则的优缺点:
      优点: 灵活, 功能性强, 逻辑性强.
      缺点: 上⼿难. ⼀旦上⼿, 会爱上这个东⻄


    ⼯具: 各⼤⽂本编辑器⼀般都有正则匹配功能. 我们也可以去
    http://tool.chinaz.com/regex/进⾏在线测试.

    正则表达式由普通字符和元字符组成. 普通字符包含⼤⼩写字⺟, 数字.
    元字符: 元字符才是正则表达式的灵魂. 元字符中的内容太多了, 在这⾥我们只介绍⼀些
    常⽤的.


    1. 字符组
    字符组很简单⽤[]括起来. []中出现的内容会被匹配. 例如:[abc] 匹配abc
    如果字符组中的内容过多还可以使⽤- , 例如: [a-z] 匹配az之间的所有字⺟ [0-9]
    匹配所有阿拉伯数字
    [a-zA-Z0-9]匹配的是所有数字和大小写字母

    [.]  字符组中的.就是字符.  不需要转义

    2. 简单元字符  (以下均为元字符,根据功能不同又细分了量词)
    基本的元字符.(常用)

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

    3. 量词
    我们到⽬前匹配的所有内容都是单⼀⽂字符号. 那如何⼀次性匹配很多个字符呢,
    我们要⽤到量词

    * 重复零次或更多次
    + 重复⼀次或更多次
    ? 重复零次或⼀次
    {n} 重复n次
    {n,} 重复n次或更多
    {n,m} 重复n到m次

    4. 惰性匹配和贪婪匹配
    在量词中的*, +,{} 都属于贪婪匹配. 就是尽可能多的匹配到结果.

    str: 麻花藤昨天让英雄联盟关服了
    reg: 麻花藤.*
    此时匹配的是整句话

    在使⽤.*后⾯如果加了? 则是尽可能的少匹配. 表⽰惰性匹配 (尽可能少的匹配)

    str: 麻花藤昨天让英雄联盟关服了
    reg: 麻花藤.*?
    此时匹配的是 麻花藤
    
    
    str: <div>胡辣汤</div>
    reg: <.*>
    结果: <div>胡辣汤</div>
    
    str: <div>胡辣汤</div>
    reg: <.*?>
    结果:
    <div>
    </div>
    
    
    str: <div>胡辣汤</div>
    reg: <(div|/div*)?>
    结果:
    <div>
    </div>

    .*?x的特殊含义 找到下⼀个x为⽌.

    str: abcdefgxhijklmn
    reg: .*?x
    结果:abcdefgx

    5. 分组
    在正则中使⽤()进⾏分组. 比如. 我们要匹配⼀个相对复的⾝份证号. ⾝份证号分
    成两种. 老的⾝份证号有15. 新的⾝份证号有18. 并且新的⾝份证号结尾有可能是x.

    给出以下正则:
    ^[1-9]d{13,16}[0-9x]$        # 此方法有问题,16-17, 或第15位数字为X 均可能出现
    ^[1-9]d{14}(d{2}[0-9x])?$
    ^([1-9]d{16}[0-9x]|[1-9]d{14})$

    6. 转义
    在正则表达式中, 有很多有特殊意义的是元字符, ⽐如 s,如果要在正则中匹
    配正常的" "⽽不是"换⾏符"就需要对""进⾏转义, 变成'\'.  元字符

    python, ⽆论是正则表达式,
    是待匹配的内容, 都是以字符串的形式出现的, 在字符串中也有特殊的含义, 本身还需要转
    . 所以如果匹配⼀次" ", 字符串中要写成'\n', 那么正则⾥就要写成"\\n",这样就太麻烦了.
    这个时候我们就⽤到了r' '这个概念, 此时的正则是r'\n'就可以了.

    *

    1 需要配合 ( ) 使用,表示() 中的内容,例如 s/(abc)/[1]/ 表示将 "abc" 变成 "[abc]"
    例如日期格式:

    String REGEX_DATE="^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$";

    其中,1表示第一个括号里的内容(注意:此处是匹配结果,不是正则表达式,比如括号中.匹配了m,则后面只能是m),以此类推,2则可以表示第二个括号里的内容, ()可以套(),里面括号排序在后面

    2,

    ^d{6}.[u2E80-u9FFF]+$

    匹配 110228 北京市密云县 这种形式

    匹配空行 ^(s*)

    *

     

    正则表达式练习
    
    # 完成手机号匹配
    reg: ^1[3-9]d{9}$
    # 以数字1开头,第二位是3-9之间的一个数字,后面取9位数字
    
    # 完成网址的匹配
    (https|http)://w+.S+
    # 以https或http://开头,数字字母下划线重复一次或更多次.除了
    以外的所有字符重复一次或更多次
    ((https|http|ftp|[a-zA-Z])://)?w*.[^u4e00-u9fa5| ]*   
    # 此处刨除中文
    
    # 完成电话号匹配
    ^((010|02d)-)?[1-9]d{7}$
    # 010或02加任意数字,区号可有可无,后面第一位1-9之间的数字,加7位数字
    ^(0[3-9]d{2}-)?[1-9]d{6,7}$
    #0加 3-9之间的数字加两位数字,区号可有可无,后面第一位1-9之间的数字,加6-7位数字
    ^(d{3}(s|-))?d{8}$|^(d{4}(s|-))?d{7,8}$
    # 3位区号-或空白,可有可无,
    
    # 匹配一个日期
    ^d{4}-d{2}-d{2}
    
    # 匹配IP地址
    ^(2[0-4]d|25[0-5]|1d{2}|[1-9]d|d).(2[0-4]d|25[0-5]|1d{2}|[1-9]d|d).(2[0-4]d|25[0-5]|1d{2}|[1-9]d|d).(2[0-4]d|25[0-5]|1d{2}|[1-9]d|d)
    
    # 匹配家庭住址.
    # xxxx市xxx区xxx街道xxx小区xxx号楼xxx单元xxx号
    ^S+?市S+?区S+?街道S+?小区S+?号楼S+?单元S+?号$
    View Code 正则表达式练习

     


     

  • 相关阅读:
    POJ 2209
    POJ 2196
    POJ 2215
    POJ 2192
    POJ 2195
    POJ 2181
    POJ 2182
    POJ 2159
    POJ 2153
    字符设备驱动 —— 字符设备驱动框架
  • 原文地址:https://www.cnblogs.com/surasun/p/9766541.html
Copyright © 2011-2022 走看看