时间:2021-05-22
问题
你正在试着使用正则表达式去匹配一大块的文本,而你需要跨越多行去匹配。
解决方案
这个问题很典型的出现在当你用点(.)去匹配任意字符的时候,忘记了点(.)不能匹配换行符的事实。比如,假设你想试着去匹配C语言分割的注释:
>>> comment = re.compile(r'/\*(.*?)\*/')>>> text1 = ''>>> text2 = '''... '''>>>>>> comment.findall(text1)[' this is a comment ']>>> comment.findall(text2)[]>>>为了修正这个问题,你可以修改模式字符串,增加对换行的支持。比如:
>>> comment = re.compile(r'/\*((?:.|\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 标记参数工作的很好,但是如果模式非常复杂或者是为了构造字符串令牌而将多个模式合并起来(2.18节有详细描述),这时候使用这个标记参数就可能出现一些问题。如果让你选择的话,最好还是定义自己的正则表达式模式,这样它可以在不需要额外的标记参数下也能工作的很好。
以上就是浅析Python 多行匹配模式的详细内容,更多关于Python 多行匹配模式的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
1.匹配模式标记:g------表示全局模式,而不是发现第一个匹配成功就立刻结束i-------表示不区分大小写模式m-----表示多行匹配,一行结束时向下一行
JS正则表达式对象模式仅有如下三种:g(全文查找出现的所有pattern)i(忽略大小写)m(多行查找)即没有单行匹配模式,Singleline(单行模式):更
在C#中,我们一般使用Regex类来表示一个正则表达式。一般正则表达式引擎支持以下3种匹配模式:单行模式(Singleline)、多行模式(Multiline)
先给大家介绍下python交互模式下输入换行/输入多行命令的方法换行方法\如:>>>print'aaa';\...print'bbb';\...print'cc
本文实例讲述了Python正则表达式非贪婪、多行匹配功能。分享给大家供大家参考,具体如下:一些regular的tips:1非贪婪flag>>>re.findal