正则表达式
  Regular Expression,缩写为regex、regexp、RE等;
分类
  1、BRE 基本正则表达式,grep、sed、vi等软件支持,vim有扩展;
  2、ERE 扩展正则表达式,egrep(grep -E)、sed -r等;
  3、PCRE 几乎所有高级语言都是PCRE的方言或者变种;“grep -P” 使grep支持perl语言的正则表达式语法;
基本语法

元字符(metacharacter)

  1. . 匹配除换行符外任意一个字符;
  2. [abc] 字符集合,只能表示一个字符位置,匹配所包含的任意一个字符;
  3. [^abc] 字符集合,只能表示一个字符位置,匹配除去集合内字符的任意一个字符;
  4. [a-z] 字符范围,也是一个集合,表示一个字符位置,匹配所包含的任意一个字符;
  5. [^a-z] 字符范围,也是一个集合,表示一个字符位置,匹配除去集合内字符的任意一个字符;
  6. \b 匹配单词的边界;
  7. \B 不匹配单词边界;
  8. \d [0-9]匹配1位数字;
  9. \D [^0-9]匹配1位非数字
  10. \s 匹配1位空白字符,包括换行符、制表符、空格;[\f\r\n\t\v]
  11. \S 匹配1位非空白字符;
  12. \w 匹配[a-zA-Z0-9_],包括中文的字
  13. \W 匹配\w之外的字符

 .  匹配除换行符外的任意一个字符

  

  这个点基本上代表所有了;属于贪婪匹配;

[abc] 字符集合,只能表示一个字符位置,匹配所包含的任意一个字符;

  

  如果要匹配dream文件中的av关键字,可以这么写:

  

[^abc] 字符集合,只能表示一个字符位置,匹配除去集合内字符的任意一个字符;

  

[a-z] 字符范围,也是一个集合,表示一个字符位置,匹配所包含的任意一个字符;

  

  

[^a-z] 字符范围,也是一个集合,表示一个字符位置,匹配除去集合内字符的任意一个字符;

  

\b 匹配单词的边界

  

\B 不匹配单词边界;

  

  可以理解为过滤不是以e结尾e;

  

  可以理解为过滤不是以e开头的e;

  

\d [0-9]匹配1位数字;

  

\D [^0-9]匹配1位非数字

  

 \s  \S  \w  \W    这4个涉及到不可见字符,不太好展示,知道这个意思就好;

转义
  凡是在正则表达式中有特殊意义的符号,如果想使用它的本意,请使用\转义,反斜杠自身得使用\\;
  \r 、\n在转义后代表回车、换行;

重复

  1. * 表示前面的正则表达式会重复0次或多次;
  2. + 表示前面的正则表达式重复至少1次;
  3. 表示前面的正则表达式会重复0次;
  4. {n} 重复固定的n
  5. {n,} 重复至少n
  6. {n,m} 重复nm

 #举例说明

  1. # 使用的测试文件
  2. abcd
  3. abbcd
  4. a
  5. ac
  6. ae
  7. ba
  8. bat

  表示重复"b"字母0次或者多次,也就是说字母"a"的旁边这个"b"字母是可以不存在的;

  表示字母"b"至少要出现1次;也就是b>=1;

  表示,字母"v"可以不用出现,但是如果文件中有"vb"、"vvb"关键字,则该正则表达式只匹配一字母"v";

  1. 这地方可以这么理解,首先要记住一个核心"对于元字符的匹配,只表示一个字符的位置",所以:
  2. a[b]{1} <==> a[b]
  3. a[b]{2} <==> a[b][b]
  4. a[a-c]{2} <==> a[a-c][a-c]
    ...以此类推...
    {n,}、{n,m}也是此类道理;
    # 匹配国内座机:grep -P "\d{3,4}-\d{7,8}"
    # 匹配国内手机号:grep -P "\d{11}"

 分组

  1. x|y 匹配x或者y
  2. (pattern) 使用小括号指定一个子表达式,也叫分组,捕获后会自动分配组号从1开始,可以改变优先级;
  3. \数 匹配对应的分组
  4. (?:pattern) 如果仅仅为了改变优先级,就不需要捕获分组;
  5. (?<name>exp)(?'name'exp) 分组捕获,但是可以通过name访问分组,Python语法必须是(?P<name>exp);

  从上图可以看出,通过加竖线的方式,匹配到了foot和boot;

  由于grep不能直观的展示正则表达式分组的概念,只能借助工具RegEx Tester来实现,从上图可以看出,对该表达式分了一个组,组成员时f和b;可以看到,分组的代号是1,如果要匹配该分组\1即可;

  如果不需要捕获该分组,则在分组内加?:即可;从上图可以看出,原来有分组的地方,没有该列了;

  如果不知道该分组的分组号,可以给该分组起个名字;

零宽断言

  1. (?=exp) 零宽度正预测先行断言,断言exp一定在匹配的右边出现,也就是说断言后面一定跟个exp
  2. (?<=exp) 零宽度正回顾后发断言,断言exp一定在匹配的左边出现,也就是说前面一定有个exp前缀;

  上图所表示的意思就是,断定b或者w后面有"oo";换句话说就是我断定我所匹配的b或w后面有oo;

  上图所表示的意思就是,我断定我所匹配的t或k的前面有oo;

负向零宽断言

  1. (?!exp) 零宽度负预测先行断言,断言exp一定不会出现在右侧,也就是说断言后面一定不是exp
  2. (?<!exp) 零宽度负回顾后发断言,断言exp一定不能出现在左侧,也就是说断言前面一定不能是exp
  3. (?#comment) 注释;示例:f(?=oo)(?#这个后断言不捕获)

  "grep -P"竟然不支持,只能软件展示了,上图中的意思是,断定匹配的字母b右边没有oo;

  上图中的意思为,断定匹配的字母n的左边没有oo;

贪婪与非贪婪

默认是贪婪模式,也就是说尽量多匹配更长的字符串;
非贪婪很简单,在重复的符号后面加上一个?问号,就尽量的少匹配了;

  1. *? 匹配任意次,但是尽可能少重复;
  2. +? 匹配至少1次,但尽可能少重复;
  3. ?? 匹配0次或1次,但尽可能少重复;
  4. {n,}? 匹配至少n次,但尽可能少重复;
  5. {n,m}? 匹配至少n次,至多m次,但尽可能少重复;

引擎选项

  1. 代码 说明 Python
  2. lgnoreCase 匹配时忽略大小写 re.lre.lGNORECASE;
  3. Singleline 单行模式,可以匹配所有字符,包括\n; re.Sre.MULTILINE
  4. Multiline 多行模式,^行首,$行尾; re.Mre.MULTILINE
  5. lgnorePatternWhitespace 忽略表达式中的空白字符,如果要使用空白字符用转义,#可以用来做注释; re.Xre.VERBOSE

单行模式

  1. . 可以匹配所有字符,包括换行符;
  2. ^ 表示整个字符串的开头,$ 整个字符串的结尾

多行模式

  1. . 可以匹配除了换行符之外的字符;
  2. ^ 表示行首,$ 表示行尾;
  3. ^ 表示真个字符串的开始,$ 表示真个字符串的结尾;开始指的是\n后紧接着下一个字符,结束指的是\n前的字符;

可以认为,单行模式就如同看穿了换行符,所有文本就是一个常常的只有一行的字符串,所有^就是这一行字符串的行首,$就是这一行的行尾;
多行模式,无法穿透换行符,^和$还是行首行尾的意思,只不过限于每一行;
注意:注意字符串中看不见的换行符,\r\n会影响e$的测试;e$只能匹配e\n;

  1. \d 1位数字
  2. [1-9]?\d 1-2位数字
  3. ^([1-9]\d\d?|\d) 1-3位数字
  4. ^([1-9]\d\d?|\d)$ 1-3位数的行
  5. ^([1-9]\d\d?|\d)\r?$ 1-3位数的行,并且忽略回车
  6. ^([1-9]\d\d?|\d)(?!\d) 数字开头1-3位数,并且之后不能是数字
  1. ip地址匹配分析:
  2. 可以将ip地址拆开来看
  3. 000--199 ---> [0-1]?[0-9]?[0-9]
  4. 200--249 ---> 2[0-4][0-9]
  5. 250--255 ---> 25[0-5]
  6. 下面两种形式其实一样,仅仅是把[0-9]换成了\d;
  7. (?:(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])
  8. (?:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[0-1]?\d?\d)

ip地址分析这地方用?:是因为产生了两个差不多一样的分组,所以需要放弃一个;

选出含有ftp的链接,且文件类型是gz或者xz的文件名:

  1. #示例文件内容
  2. ftp://ftp.astron.com/pub/file/file-5.14.tar.gz
  3. ftp://ftp.gmplib.org/pub/gmp-5.1.2/gmp-5.1.2.tar.xz
  4. ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2
  5. http://anduin.linuxfromscnatch.org/sources/LFS/lfs-packages/conglomeration//iana-etc/iana-etc-2.30.tar.bz2
  6. http://anduin.linuxfromscnatch.org/sources/other/udev-lfs-205-l.tar.bz2
  7. http://download.savannah.gnu.org/releases/libpipeline/libpipeline-1.2.4.tar.gz
  8. http://download.savannah.gnu.org/releases/man-db/man-db-2.6.5.tar.xz
  9. http://download.savannah.gnu.org/releases/sysvinit/sysvinit-2.88dsf.tar.bz2
  10. http://ftp.altlinux.org/pub/people/legion/kbd/kbd-1.15.5.tar.gz
  11. http://mirror.hust.edu.cn/gnu/autoconf/autoconf-2.69.tar.xz
  12. http://mirror.hust.edu.cn/gnu/automake/automake-1.14.tar.xz
  1. 正则表达式:
  2. 取出包含gz|xz后缀文件的路径(三种方式):
  3. .*ftp.*\.(?:gz|xz)
  4. ftp.*/(.*(?:gz|xz))
  5. .*ftp.*/([^/]*\.(?:gz|xz))
  6. 取出以gz|xz结尾的文件名:
  7. (?<=.*ftp.*/)[^/]*\.(?:gz|xz)
  1. 匹配邮箱地址:
  2. 示例文件:
  3. test@hot-mail.com
  4. v-ip@163.com
  5. web.manager@zhide.com.cn
  6. super.user@google.com
  7. a@w-a-com
  8. 1072051214@qq.com
  9. 匹配:
  10. grep -P "([a-zA-Z-0-9-\.]+)@([\w-\.]+\.[\w-]+)"
    grep -P "\w[-.\w]*@[\w-]+(\.[\w-]*)+"
  1. html提取
  2. grep -P "<[^<>]+>(.*)<[^<>]+"
  3. 如果要匹配标记a
  4. grep -P "<(\w+)\s+[^<>]+>(.*)(</\1>)"
  1. URL提取:
  2. (\w+)://([^\s]+)
  3. 身份证验证:
  4. 身份证验证需要使用公式计算,最严格的应该是实名认证,这里简单写一个;
  5. \d{17}[0-9xX]|\d{15}

第二十天python3 正则表达式的更多相关文章

  1. 详解 Python3 正则表达式(五)

    上一篇:详解 Python3 正则表达式(四) 本文翻译自:https://docs.python.org/3.4/howto/regex.html 博主对此做了一些注明和修改 ^_^ 非捕获组和命名 ...

  2. 详解 Python3 正则表达式(四)

    上一篇:详解 Python3 正则表达式(三) 本文翻译自:https://docs.python.org/3.4/howto/regex.html 博主对此做了一些注明和修改 ^_^ 更多强大的功能 ...

  3. 详解 Python3 正则表达式(三)

    上一篇:详解 Python3 正则表达式(二) 本文翻译自:https://docs.python.org/3.4/howto/regex.html 博主对此做了一些批注和修改 ^_^ 模块级别的函数 ...

  4. 详解 Python3 正则表达式(二)

    上一篇:详解 Python3 正则表达式(一) 本文翻译自:https://docs.python.org/3.4/howto/regex.html 博主对此做了一些批注和修改 ^_^ 使用正则表达式 ...

  5. 详解 Python3 正则表达式(一)

    本文翻译自:https://docs.python.org/3.4/howto/regex.html 博主对此做了一些批注和修改 ^_^ 正则表达式介绍 正则表达式(Regular expressio ...

  6. python025 Python3 正则表达式

    Python3 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. ...

  7. python3 正则表达式学习笔记

    re.match函数 re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none. ~匹配成功re.match方法返回一个匹配的对象,否则返回No ...

  8. Python3正则表达式

    正则表达式是一个特殊的字符序列,他能帮助你方便的检查一个字符串是否与某种模式匹配.   re.match函数 re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,matc ...

  9. python3正则表达式总结

    转自csdn,去这里看更多吧: https://blog.csdn.net/weixin_40136018/article/details/81183504 还有一个废话很多的详细系列,在这里:htt ...

随机推荐

  1. css自定义省略实例1

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. resultMap,日志,分页

    问题:属性名和字段名不一致 解决方法 起别名 select id, username, password as pwd from db4.user resultMap结果集映射 id username ...

  3. nginx1.1 nginx介绍和反向代理

    1.什么是nginx nginx是一个高性能的http和反向代理的web服务器,所占内存小,高并发 nginx默认端口:80端口 命令存放目录:cd /usr/local/nginx/sbin 配置文 ...

  4. 李阳:京东零售OLAP平台建设和场景实践

    导读: 今天和大家分享京东零售OLAP平台的建设和场景的实践,主要包括四大部分: 管控面建设 优化技巧 典型业务 大促备战 -- 01 管控面建设 1. 管控面介绍 管控面可以提供高可靠高效可持续运维 ...

  5. Java高并发-多线程基础

    一.什么是线程 线程是进程内的执行单元. 二.线程的基本操作 2.1 状态与操作 2.2 新建线程 Thread t1 = new Thread(new CreateThread()); t1.sta ...

  6. 127_Power Pivot&Power BI DAX计算订单商品在库时间(延伸订单仓储费用)

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 前面已经写过一个先进先出的库龄案例,在业务发生又有这样一个需求:先进先出前提,需要按照订单计算每个商品在库时间, ...

  7. USACO 刷题小记

    \(\text{High Card Low Card}\) USACO2015DEC Platinum T2 贝西和艾尔西在玩游戏.有 \(2n\) 张牌,牌上的数字是 \(1\) 到 \(2n\) ...

  8. Bean Validator

    Bean Validator 关于Jakarta EE 2018年03月, Oracle 决定把 JavaEE 移交给开源组织 Eclipse 基金会,并且不再使用Java EE这个名称. 因此jav ...

  9. 本地创建的jupyter notebook 无法连接本地环境(即不能运行代码)

    参考:https://www.cnblogs.com/damin1909/p/12691147.html 本人所用的python是anaconda下的,由于需求不同,创建了好多个python用于不同的 ...

  10. 如何优化PlantUML流程图(时序图)

    这篇文章用来介绍,如何画出好看的流程图. 1. 选择合适的组件 1.1 plantuml官方提供的组件 1.2 加载图片 1.2.1 加载本地图片 1.2.2 加载网络图片 1.2.3 图片资源 2. ...