多行匹配模式

问题

你正在试着使用正则表达式去匹配一大块的文本,而你需要跨越多行去匹配。

解法

这个问题很典型的出现在当你用点 (.) 去匹配任意字符的时候,忘记了点 (.) 不能匹配换行符的事实。比如,假设你想试着去匹配 C 语言分割的注释:

>>> comment = re.compile(r'/\*(.*?)\*/')
>>> text1 = '/* this is a comment */'
>>> text2 = '''/* this is a
... multiline comment */
... '''
>>>
>>> comment.findall(text1)
[' this is a comment ']
>>> comment.findall(text2)
[]
>>>

为了修正这个问题,你可以修改模式字符串,增加对换行的支持。比如:

>>> comment = re.compile(r'/\*((?:.j\n)*?)\*/')
>>> comment.findall(text2)
[' this is a\n multiline comment ']
>>>

在这个模式中, (?:.|\n) 指定了一个非捕获组 (也就是它定义了一个仅仅用来做匹配,而不能通过单独捕获或者编号的组)。

讨论

re.compile() 函数接受一个标志参数叫 re.DOTALL ,在这里非常有用。它可以让正则表达式中的点 (.) 匹配包括换行符在内的任意字符。比如:

>>> comment = re.compile(r'/\*(.*?)\*/', re.DOTALL)
>>> comment.findall(text2)
[' this is a\n multiline comment ']

对于简单的情况使用 re.DOTALL 标记参数工作的很好,但是如果模式非常复杂或者是为了构造字符串令牌而将多个模式合并起来,这时候使用这个标记参数就可能出现一些问题。如果让你选择的话,最好还是定义自己的正则表达式模式,这样它可以在不需要额外的标记参数下也能工作的很好。

《Python Cookbook 3rd》笔记(2.8):多行匹配模式相关推荐

  1. 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素

    <Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...

  2. 《Python Cookbook 3rd》笔记汇总

    文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...

  3. Python Cookbook 3rd Edition Documentation

    Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...

  4. 《Python cookbook》笔记二

    <Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...

  5. Machine Learning with Python Cookbook 学习笔记 第9章

    Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...

  6. Machine Learning with Python Cookbook 学习笔记 第8章

    Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...

  7. Machine Learning with Python Cookbook 学习笔记 第6章

    Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...

  8. 《Python cookbook》笔记一

    <Python cookbook> 第一章 数据结构和算法 - *号解压多个变量 - 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError .那么 怎样才能从这个可 ...

  9. Python Cookbook学习笔记ch2_01

    第二章,也可以去这里查看笔记噢虫洞在这里 2.1使用多个界定符分隔字符串 问题:将一个字符串分隔为多个字段,但是分隔符并不是固定的 方案:string对象的split() 只适用于简单的字符串分隔,他 ...

最新文章

  1. 矩阵正态分布基础1 外形式、外积与微分形式简介
  2. 萝卜家园win11 32位官方旗舰版iso文件v2021.08
  3. [LeetCode] Surrounded Regions, Solution
  4. java9之后,String为何从char类型数组转成byte类型数组
  5. ios 8 适配须知
  6. NetSpeedMonitor:在任务栏中监视网络下载、上传情况
  7. Github优秀开源项目
  8. 计算机vfp考试笔试试题,关于计算机的二级VFP笔试试题
  9. 解决火狐浏览器中文乱码问题
  10. 网络存储-详解NAS网络存储
  11. ARM——开发工具—编译器
  12. 小程序标准版交易组件开启
  13. 织梦后台发布文章编辑器不显示的解决办法
  14. Python二手房价格预测(二)——数据处理及数据可视化
  15. Android 判断手机设备是否是小米,华为,魅族设备
  16. Linux下convert批处理的命令及其与Windows下nconvert的区别与联系
  17. 谷歌SEO-外链策略
  18. 远程代答系统如何自动代答题?
  19. NFT Insider #45:游戏巨头育碧与 The Sandbox 达成合作,YGG SEA战略投资 Dappie Gang
  20. 计算机主机板的各种接口安装,计算机主板上的插座或接口有哪些

热门文章

  1. redis php怎么使用教程,PHP 使用redis
  2. qt能使用logback_X04Logback的配置
  3. 如何修改SharePoint服务器场管理员帐户和密码
  4. SharePoint三个主要数据库
  5. java lambda 循环list_Java8--Lambda表达式对List集合操作(一)
  6. 【开源项目】EasyCmd命令图形化软件
  7. 【Python CheckiO 题解】Absolute Sorting
  8. 执行 redis-dump 报错:ERROR (Errno::ENOENT): No such file or directory - ps -o rss= -p xxxxx
  9. 【牛客 - 1080D】tokitsukaze and Event(最短路,思维)
  10. 【ZOJ - 4029】Now Loading!!!(整除分块,思维,二分,前缀和)