ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2.8多行匹配

2022-02-21 11:33:46  阅读:181  来源: 互联网

标签:多行 comment 匹配 text2 re 2.8 print findall


问题

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

解决方案

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

import re

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

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

comment = re.compile(r'/\*((?:.|\n)*?)\*/')
print(comment.findall(text1)) # ->[' this is a comment ']
print(comment.findall(text2))  # -> [" this is a \n      'comment "]

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

讨论

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

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

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

标签:多行,comment,匹配,text2,re,2.8,print,findall
来源: https://www.cnblogs.com/ye-peng/p/15918091.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有