美文网首页
Python3 - 多行匹配模式

Python3 - 多行匹配模式

作者: 惑也 | 来源:发表于2018-12-19 09:23 被阅读40次

问题

使用正则表达式匹配一大块文本时,需要跨多行去匹配。

解决方案

当用点(.)去匹配任意字符的时候,容易忘记点(.)不能匹配换行符的事实。 比如:

import re

recom = re.compile('/\*(.*?)\*/')   # 匹配/* 和 */之间的字符串,*?表示非贪婪模式匹配

text1 = '/* this is a comment */'
print(recom.findall(text1))
[' this is a comment ']

text2 = '''/* this is a 
        multiline comment */
        '''
print(recom.findall(text2))
[]

修改模式字符串,增加对换行的支持。比如:

com = re.compile(r'/\*((?:.|\n)*?)\*/')
print(com.findall(text2))
[' this is a \nmultiline comment ']

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

讨论

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

rc = re.compile(r'/\*(.*?)\*/', re.DOTALL)
print(rc.findall(text2))
[' this is a \nmultiline comment ']

对于简单的匹配情况,推荐使用 re.DOTALL 标记参数的方式实现点(.)匹配包括换行符,但是如果模式非常复杂或者是为了构造字符串令牌而将多个模式合并起来, 使用这个标记参数可能会出现问题,建议定义自己的正则表达式模式,这样它可以在不需要额外的标记参数下实现匹配。

相关文章

  • Python3 - 多行匹配模式

    问题 使用正则表达式匹配一大块文本时,需要跨多行去匹配。 解决方案 当用点(.)去匹配任意字符的时候,容易忘记点(...

  • python正则表达式

    . 匹配任意字符(不包括换行符)^ 匹配开始位置,多行模式下匹配每一行的开始$ 匹配结束位置,多行模式下匹配每一...

  • 正则表达式

    pattern(模式) 描述了表达式的模式 modifiers(修饰符) 用于指定全局匹配、区分大小写的匹配和多行...

  • 【Python进阶】2.8多行匹配模式

    2.8 多行匹配模式 问题 你正在试着使用正则表达式去匹配一大块的文本,而你需要跨越多行去匹配。 解决方案 这个问...

  • Java正则

    元字符 匹配次数 匹配范围 匹配位置 子表达式 前后查找 回溯引用 特殊替换 多行匹配 贪婪模式 纯文本和点 ja...

  • golang regexp Flag 用法匹配换行

    Flag含义i不区分大小写s让.匹配\n(单行模式)m除了开始/结束文本外,让^并$匹配开始/结束行(多行模式) ...

  • Scala 模式匹配

    一、模式匹配基本使用 说明: => 后的代码可以写多行且不用 { } 模式匹配也是表达式,所以它也可以赋值给一个变...

  • golang 正则

    . 匹配多行,匹配包括\n 忽略大小写 多行使用^ $匹配行首和行尾

  • 5.3 多行模式

    “多行模式”听起来是与“单行模式”对应的,其实这两个模式没有任何联系。 单行模式影响的是点号的匹配规则:在默认模式...

  • 6.python3注释

    单行注释 Python3中单行注释以 # 开头举个栗子: 多行注释 Python3中多行注释用三个单引号 ''' ...

网友评论

      本文标题:Python3 - 多行匹配模式

      本文链接:https://www.haomeiwen.com/subject/wqwrkqtx.html