zoukankan      html  css  js  c++  java
  • Python进阶之正则表达式

    概念

    正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

    目的  

    给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
    1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”)。
    2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。

    符号

    正则表达试由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义,我下面会给予解释。在最简单的情况下,一个正则表达式看上去就是一个普通的查找串。例如,正则表达式"testing"中没有包含任何元字符,它可以匹配"testing"和"testing123"等字符串,但是不能匹配"Testing"。要想真正的用好正则表达式,正确的理解元字符是最重要的事情。下表列出了所有的元字符和对它们的一个简短的描述。
    正则
    待匹配字符
    匹配
    结果
    说明
    [0123456789]
    8
    True
    在一个字符组里枚举合法的所有字符,字符组里的任意一个字符
    和"待匹配字符"相同都视为可以匹配
    [0123456789]
    a
    False
    由于字符组中没有"a"字符,所以不能匹配
     
    [0-9]
     
    7
    True
    也可以用-表示范围,[0-9]就和[0123456789]是一个意思
     
    [a-z]
     
    s
     
    True
     
    同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示
     
    [A-Z]
     
    B
     
    True
     
    [A-Z]就表示所有的大写字母
     
    [0-9a-fA-F]
     
    e
     
    True
     
    可以匹配数字,大小写形式的a~f,用来验证十六进制字符

    字符

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

    量词

    量词
    用法说明
    * 重复零次或更多次(贪婪匹配)
    + 重复一次或更多次(贪婪匹配)
    ? 重复零次或一次
    {n} 重复n次
    {n,} 重复n次或更多次
    {n,m} 重复n到m次
     
    这边推荐一个验证正则表达式的一个工具 http://tool.chinaz.com/regex/
    接下来大家可以使用上面的工具来测试下面说的实例

    实例

    匹配任意数字

    [0123456789]---abc123def456只要一个字符串中包含数字,都会被匹配到

    匹配任意小写字母

    [a-z] ----abc123def456只要字符串中包含任意小写字符,都会被匹配

    匹配任意大写字母

    [A-Z] ----ABC123DEF456只要字符串中包含任意大写字符,都会被匹配

    匹配数字+小写字母+大写字母

    [0-9A-Za-z] ----ABCabc123DEF456只要字符串中包含数字小写大写字母都回匹配

    w与W与[wW](匹配所有字符)

      

    s与S与[sS](匹配所有字符)

      

    d与D与[dD](匹配所有字符)

      

    与 (tab制表符与

      

    ^(匹配一个字符串的开头) 与$

      (匹配以[a-z]开头,以[a-z]结尾的字符串,这里只能匹配2个字符的字符串,因为[]代表一个字符组)

    a|b(从左向右匹配,优先匹配a)

       (左边匹配了,右边不会再匹配)

    [^...]

      

    组合练习

    *+?{}

    待匹配字符串 正则表达式 匹配结果 说明

    小李和小王和小亮

    小李和小王王和小亮亮亮

    [^和]+

    小李
    小王
    小亮

    小李
    小王王
    小亮亮亮

    匹配非'和'的所有字符串多次

    小李和小王王和小亮亮亮 [^和]{2,4} 小李
    小王王
    小亮亮亮
    匹配非‘和’的所有字符串2到4次
    小李和小王王和小亮亮亮 [^和]{2,4}? 小李
    小王
    小亮
    亮亮
    匹配非‘和’的所有字符串2次
    小李和小王王和小亮亮亮 小.? 小李
    小王
    小亮
    匹配小后面任意字符0次或1次
    小李和小王王和小亮亮亮 小.* 小李和小王王和小亮亮亮 匹配小后面任意字符0次或多次
    小李和小王王和小亮亮亮 小.+ 小李和小王王和小亮亮亮 匹配小后面任意字符一次或多次
    小李和小王王和小亮亮亮 小.{1,2} 小李和
    小王王
    小亮亮
    匹配小后面任意字符一次到2次
    小李和小王王和小亮亮亮  小.*?

     匹配小后面任意字符0次(因为有?限制,表示匹配最少的页就是0次即什么都不匹配)

    字符集[] [^]

    待匹配字符串 正则表达式 匹配结果 说明
    小李和小王王和小亮亮亮 小[李王王亮亮亮]* 小李
    小王王
    小亮亮亮
    匹配小后面字符组里面任意字符0次或多次
    小李和小王王和小亮亮亮  小[^和]* 小李
    小王王
    小亮亮亮
     匹配小后面非和子的任意字符0次或多次
     123abc345  [d]

    1

    2

    3

    3

    4

    5

     匹配任意一个数字
     123abc345  [d]*

    123

    345

     匹配任意多个数字
     123abc345  [d]+

    123

    345

     匹配任意多个数字

    分组()与或 | [^]

    匹配15位或18位身份证,15位需都是数字组成,18位可以是数字或x结尾,首位都不能为0

    待匹配字符串 正则表达式 匹配结果 说明
    110621199012014599 ^[1-9]d{13,16}[0-9x]$ 110621199012014599 可以匹配到一个正确的身份证,但是如果是16位1106211990120145也同样能匹配到,但是这并不是身份证
      ^[1-9]d{14}(d{2}[0-9x])?$   不会再匹配错误的身份证(你可以试试的)
    110621199012014599 ^([1-9]d{16}[0-9x]|[1-9]d{14})$ 110621199012014599 这个是比较好的表达式,先匹配18位,再匹配15位

    总结

    要想熟练的使用正则表达式,还是要多练多写吧! 希望大家能像计算1+1=2这么简单的使用正则表达式

  • 相关阅读:
    linux离线安装nodejs ,配置环境,离线配置全局包
    前端项目路由使用browserHistory不能刷新,页面刷新错误,
    手机uc浏览器打不开本地网页,网页一片空白
    display:flex兼容性,
    react生产环境样式丢失问题 在浏览器中看到标签有类名,但没有样式
    redux使用redux-thunk中间件处理异步状态管理请求
    配置Redux DevTools
    flex-grow属性在文本过长时会超出父窗体长度
    react配置代理,解决跨域
    react修改状态
  • 原文地址:https://www.cnblogs.com/linuxchao/p/linux-re.html
Copyright © 2011-2022 走看看