开发者社区 问答 正文

多行匹配模式

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

展开
收起
哦哦喔 2020-04-16 19:17:58 1086 分享 版权
1 条回答
写回答
取消 提交回答
  • 这个问题很典型的出现在当你用点(.)去匹配任意字符的时候,忘记了点(.)不能匹配换行符的事实。 比如,假设你想试着去匹配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) 指定了一个非捕获组 (也就是它定义了一个仅仅用来做匹配,而不能通过单独捕获或者编号的组)。
    
    2020-04-16 19:18:17
    赞同 展开评论
问答地址: