正则表达式是从信息中搜索特定的模式的一把瑞士军刀。它们是一个巨大的工具库,其中的一些功能经常被忽视或未被充分利用。今天我将向你们展示一些正则表达式的高级用法。

举个例子,这是一个我们可能用来检测电话美国电话号码的正则表达式:

我们可以加上一些注释和空格使得它更具有可读性。

让我们把它放到一个代码片段里:

输出,不带空格:

正则表达式是 python 的一个很好的功能,但是调试它们很艰难,而且正则表达式很容易就出错。

幸运的是,python 可以通过对 re.compile 或 re.match 设置 re.DEBUG (实际上就是整数 128) 标志就可以输出正则表达式的解析树。

解析树

贪婪和非贪婪

在我解释这个概念之前,我想先展示一个例子。我们要从一段 html 文本寻找锚标签:

结果将在意料之中:

我们改下输入,添加第二个锚标签:

结果看起来再次对了。但是不要上当了!如果我们在同一行遇到两个锚标签后,它将不再正确工作:

这次模式匹配了第一个开标签和最后一个闭标签以及在它们之间的所有的内容,成了一个匹配而不是两个 单独的匹配。这是因为默认的匹配模式是“贪婪的”。

当处于贪婪模式时,量词(比如 * 和 +)匹配尽可能多的字符。

当你加一个问号在后面时(.*?)它将变为“非贪婪的”。

现在结果是正确的。

前向界定符和后向界定符

一个前向界定符搜索当前的匹配之后搜索匹配。通过一个例子比较好解释一点。

下面的模式首先匹配 foo,然后检测是否接着匹配 bar:

这看起来似乎没什么用,因为我们可以直接检测 foobar 不是更简单么。然而,它也可以用来前向否定界定。 下面的例子匹配foo,当且仅当它的后面没有跟着 bar。

后向界定符类似,但是它查看当前匹配的前面的模式。你可以使用 (?> 来表示肯定界定,(?

下面的模式匹配一个不是跟在 foo 后面的 bar。

条件(IF-Then-Else)模式

正则表达式提供了条件检测的功能。格式如下:

(?(?=regex)then|else)

条件可以是一个数字。表示引用前面捕捉到的分组。

比如我们可以用这个正则表达式来检测打开和闭合的尖括号:

在上面的例子中,1 表示分组 (

条件也可以是界定符。

无捕获组

分组,由圆括号括起来,将会捕获到一个数组,然后在后面要用的时候可以被引用。但是我们也可以不捕获它们。

我们先看一个非常简单的例子:

现在我们改动一点点,在前面加上另外一个分组 (H.*):

模式数组改变了,取决于我们在代码中怎么使用这些变量,这可能会使我们的脚本不能正常工作。 现在我们不得不找到代码中每一处出现了模式数组的地方,然后相应地调整下标。 如果我们真的对一个新添加的分组的内容没兴趣的话,我们可以使它“不被捕获”,就像这样:

通过在分组的前面添加 ?:,我们就再也不用在模式数组中捕获它了。所以数组中其他的值也不需要移动。

命名组

像前面那个例子一样,这又是一个防止我们掉进陷阱的方法。我们实际上可以给分组命名, 然后我们就可以通过名字来引用它们,而不再需要使用数组下标。格式是:(?Ppattern) 我们可以重写前面那个例子,就像这样:

现在我们可以添加另外一个分组了,而不会影响模式数组里其他的已存在的组:

使用回调函数

在 Python 中 re.sub() 可以用来给正则表达式替换添加回调函数。

让我们来看看这个例子,这是一个 e-mail 模板:

注意到每一个替换都有一个共同点,它们都是由一对中括号括起来的。我们可以用一个单独的正则表达式 来捕获它们,并且用一个回调函数来处理具体的替换。

所以用回调函数是一个更好的办法:

不要重复发明轮子

更重要的可能是知道在什么时候不要使用正则表达式。在许多情况下你都可以找到 替代的工具。

解析 [X]HTML

Stackoverflow 上的一个答案用一个绝妙的解释告诉了我们为什么不应该用正则表达式来解析 [X]HTML。

你应该使用使用 HTML 解析器,Python 有很多选择:

lxml 是一个功能齐全基于 c 的快速的库

后面两个即使是处理畸形的 HTML 也能很优雅,这给大量的丑陋站点带来了福音。

ElementTree 的一个例子:

其他

在使用正则表达式之前,这里有很多其他可以考虑的工具。

python正则表达式两个条件_python高级正则表达式相关推荐

  1. python判断两个条件同时满足_python不相等的两个字符串的 if 条件判断为True详解...

    今天遇到一个非常基础的问题,结果搞了好久好久.....赶快写一篇博客记录一下: 本来两个不一样的字符串,在if 的条件判断中被判定为True,下面是错误的代码: test_str = 'happy' ...

  2. Linux正则表达式多个条件并,linux 正则表达式深度解析

    简介 大体来讲,正则表达式的文法分为3种标准:BRE.ERE 和 ARE.其中 BER 和 ERE 属于 POSIX 标准,ARE 则是由各家定义的扩展. POSIX 正则表达式 传统上,POSIX ...

  3. python优秀程序员条件_Python 条件语句

    Python 条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: Python程序语言指定任何非0和 ...

  4. python多个判断条件_Python基础介绍 | 条件判断Conditionals

    先前我们已经学了如何使用Strings和Numbers两个数据类型,还有其他的数据类型,例如列表啊.字典啊,我们先放着不学,但以下的内容多多少少少会涉及. 今天学啥呢?我们来看看条件判断,即Condi ...

  5. python求两数最大公因数_Python求两个数的最大公约数

    Python求两个数的最大公约数 一.求最大公约数算法: 1. 整数A对整数B进行取整, 余数用整数C来表示 举例: C = A % B 2. 如果C等于0,则C就是整数A和整数B的最大公约数 3. ...

  6. python re模块详解_python与正则表达式:re模块详解

    re模块是python中处理正在表达式的一个模块 正则表达式知识储备:http://www.cnblogs.com/huamingao/p/6031411.html 1. match(pattern, ...

  7. python正则表达式中括号的用法_Python的正则表达式中的圆括号到底如何使用?

    这个问题并不太严重,严格来说我这样提问有些草率,不过也有人关注那我就把自己百度探究的结果写一写好了,有错误则请指出来. 首先是文档说明: >>> import re >> ...

  8. python中文字符串多余空格_python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解...

    python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解 在pdf转为文本的时候,经常会多出空格,影响数据观感,因此需要去掉文本中多余的空格,而文本中的英文之间的正常空格需要保留,输入 ...

  9. python正则去掉重复单词_python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解 | 学步园...

    在pdf转为文本的时候,经常会多出空格,影响数据观感,因此需要去掉文本中多余的空格,而文本中的英文之间的正常空格需要保留,输入输出如下: input:我今天 赚了 10 个亿,老百姓very happ ...

最新文章

  1. 08_传智播客iOS视频教程_点语法
  2. 苹果iOS系统下检查第三方APP是否安装及跳转启动
  3. 管理员端API——任仲行
  4. php 按 截取字符串,PHP按符号截取字符串的指定部分
  5. percona+mysql插件_使用percona mysql插件来监控mysql5.7
  6. 力扣114. 二叉树展开为链表(C++,解释一下别人的思路)
  7. linux内存管理:kmap、vmap、ioremap
  8. 通过FreeMarker生成word文档
  9. shopex PHP Notice,Shopex系统配置文件config.php说明
  10. 韩国与日本历年GDP总量和人均GDP的对比(1953-2020年)
  11. buff系统 游戏中_泛娱产业:ARPG游戏的技能系统和buff系统的一种实现
  12. Maya: 菜单 曲面 双轨成形双轨成形2工具
  13. “四通一达”本一家,这家人是如何“承包”中国快递半壁江山的?
  14. 吾生有涯 而知也无涯
  15. 吃货制霸地图生成 美食标注 中国制霸数据生成器
  16. OpenPortal V5认证计费系统说明文档
  17. Windows三种文件系统:NTFS、FAT32、FAT16的区别
  18. PCL学习二:PCL基础应用教程
  19. 服务器在局域网联机中显示,网络版局域网内如何连接设置多台电脑联机操作?...
  20. 解决 Uncaught TypeError: elem.getClientRects is not a function

热门文章

  1. gluster更换故障节点
  2. 华为nova3i能用鸿蒙吗,华为nova3i怎么打开nfc功能? 华为nova3i有nfc功能吗
  3. Windows10 如何关闭 Windows Defender (Antimalware Service Executable)
  4. <script>标签使用
  5. FFmpeg简述,源码分析,录制/压缩/水印/剪切/旋转/滤镜/美颜/上传视频等(CPU软编码和解码)
  6. 生信刷题之ROSALIND——Part 4 (MPRT, MRNA, ORF)
  7. python面向对象代码_python_面向对象—代码练习
  8. SmartSQL - 最方便、快捷的数据库文档查询生成工具(推荐)
  9. ybt.1550 花神游历各国 题解
  10. 传奇新增安全区及边框如何设置