首页后端开发PythonPython 多行匹配模式了解
恒创 云服务器免费试用

Python 多行匹配模式了解

时间2024-02-13 08:14:03发布访客分类Python浏览531
导读:收集整理的这篇文章主要介绍了Python 多行匹配模式了解,觉得挺不错的,现在分享给大家,也给大家做个参考。问题你正在试着使用正则表达式去匹配一大块的文本,而你需要跨越多行去匹配。解决方案这个问题很典型的出现在当你用点(. 去匹配任意字符的...
收集整理的这篇文章主要介绍了Python 多行匹配模式了解,觉得挺不错的,现在分享给大家,也给大家做个参考。

问题

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

解决方案

这个问题很典型的出现在当你用点(.)去匹配任意字符的时候,忘记了点(.)不能匹配换行符的事实。比如,假设你想试着去匹配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'/\*((?:.|\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 多行匹配模式了解的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

展开全文READ MORE
Python 异常处理机制详解 Python 合并多个字典或映射教程

游客 回复需填写必要信息