当前位置: 首页 > news >正文

Python正则表达式里的单行re.S和多行re.M模式

Python正则表达式里的单行re.S和多行re.M模式

 

Python 的re模块内置函数几乎都有一个flags参数,以位运算的方式将多个标志位相加。其中有两个模式:单行(re.DOTALL, 或者re.S)和多行(re.MULTILINE, 或者re.M)模式。它们初看上去不好理解,但是有时又会非常有用。这两个模式在PHP和JavaScripts里都有。

 

单行模式 re.DOTALL

在单行模式里,文本被强制当作单行来匹配,什么样的文本不会被当作单行?就是里面包含有换行符的文本,比如:

This is the first line.\nThis is the second line.\nThis is the third line.

 

点号(.)能匹配所有字符,换行符例外。现在我们希望能匹配出整个字符串,当用点号(.)匹配上面这个字符串时,在换行符的地方,匹配停止。例如:

>>> a = 'This is the first line.\nThis is the second line.\nThis is the third line.'

>>> print a

This is the first line.

This is the second line.

This is the third line.

>>> import re

>>> p = re.match(r'This.*line.' ,a)

>>> p.group(0)

'This is the first line.'

>>>

 

在上面的例子里,即使是默认贪婪(greedy)的匹配,仍然在第一行的结尾初停止了匹配,而在单行模式下,换行符被当作普通字符,被点号(.)匹配:

>>> q = re.match(r'This.*line.', a, flags=re.DOTALL)

>>> q.group(0)

'This is the first line.\nThis is the second line.\nThis is the third line.'

 

点号(.)匹配了包括换行符在内的所有字符。所以,更本质的说法是

单行模式改变了点号(.)的匹配行为

 

 

多行模式 re.MULTILINE

在多行模式里,文本被强制当作多行来匹配。正如上面单行模式里说的,默认情况下,一个包含换行符的字符串总是被当作多行处理。但是行首符^和行尾符$仅仅匹配整个字符串的起始和结尾。这个时候,包含换行符的字符串又好像被当作一个单行处理。

在下面的例子里,我们希望能将三句话分别匹配出来。用re.findall( )显示所有的匹配项

>>> a = 'This is the first line.\nThis is the second line.\nThis is the third line.'

>>> print a

This is the first line.

This is the second line.

This is the third line.

>>> import re

>>> re.findall(r'^This.*line.$', a)

[]

>>>

默认点号不匹配换行符,我们需要设置re.DOTALL。

>>> re.findall(r'^This.*line.$', a, flags=re.DOTALL)

['This is the first line.\nThis is the second line.\nThis is the third line.']

>>>

匹配出了整句话,因为默认是贪婪模式,用问号切换成非贪婪模式:

>>> re.findall(r'^This.*?line.$', a, flags=re.DOTALL)

['This is the first line.\nThis is the second line.\nThis is the third line.']

>>>

仍然是整句话,这是因为^和$只匹配整个字符串的起始和结束。在多行模式下,^除了匹配整个字符串的起始位置,还匹配换行符后面的位置;$除了匹配整个字符串的结束位置,还匹配换行符前面的位置.

>>> re.findall(r'^This.*?line.$', a, flags=re.DOTALL+re.MULTILINE)

['This is the first line.', 'This is the second line.', 'This is the third line.']

>>>

 

更本质的说法是

多行模式改变了^和$的匹配行为

 

本文转自:

https://www.lfhacks.com/tech/python-re-single-multiline

相关文章:

  • DOM: EVENT FLOW
  • 在windows10上利用Anaconda 搭建python3.6 + tensorflow环境
  • 修复win10无法双击打开txt文档.reg
  • JS的运行机制的总结!
  • 从SQL Server CloudDBA 看云数据库智能化
  • 夯实爪哇基础-数据类型,内存
  • Hibernate关联关系注解配置简单理解
  • 五大好用的开源MySQL管理工具推荐
  • day--42 前端基础小结
  • 【python】【基础】mac安装python3及pip
  • Using system view: sys.sysprocesses to check SqlServer's block and deadlock
  • JavaScript中for in 和for of的区别
  • 对于你们驳来驳去的《停止学习框架》,我有话说!
  • Linux下调整ext3分区大小【转】
  • 大快搜索获评“2018中国大数据基础软件领域领军企业”
  • Apache的基本使用
  • C++入门教程(10):for 语句
  • go语言学习初探(一)
  • Java知识点总结(JavaIO-打印流)
  • js 实现textarea输入字数提示
  • k个最大的数及变种小结
  • MySQL主从复制读写分离及奇怪的问题
  • Python学习之路16-使用API
  • scrapy学习之路4(itemloder的使用)
  • STAR法则
  • 创建一个Struts2项目maven 方式
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 前嗅ForeSpider教程:创建模板
  • 强力优化Rancher k8s中国区的使用体验
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 优化 Vue 项目编译文件大小
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • Java总结 - String - 这篇请使劲喷我
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • #define 用法
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C语言)字符分类函数
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (力扣)循环队列的实现与详解(C语言)
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (十八)SpringBoot之发送QQ邮件
  • (实战篇)如何缓存数据
  • (数据结构)顺序表的定义
  • ./configure、make、make install 命令
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .bat批处理出现中文乱码的情况
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .Net Core缓存组件(MemoryCache)源码解析
  • .Net MVC + EF搭建学生管理系统
  • .netcore如何运行环境安装到Linux服务器