使用正则表达式在文件中匹配多行(Python)

1 投票
1 回答
1710 浏览
提问于 2025-04-17 08:28

我有很多文件,每个文件里都有一组按照特定格式排列的行。我想一次性找到这些多行,并对它们进行一些操作,比如删除、移动到另一个文件等等。

文件中的多行内容如下所示。

self.unsupported_cmds = [r'\s*clns\s+routing',

                         r'\s*bfd\s+graceful-restart',

                         r'\s*ip\s+default-network',

                         r'\s*ip\s+default-gateway',

                         r'\s*ip\s+subnet-zero',

                         r'\s*ip\s+cef\s*$' ]

方括号里的内容可能会有所不同。

请帮我一下,怎么才能做到这一点。

1 个回答

1

根据Python的re模块的文档,你可以在re.compile方法中添加标志。这样做可以让你一次性匹配整个文件。

import re

regex = re.match(r'''(
    ^\s*clns\s+routing$ |
    ^\s*bfd\s+graceful-restart$ |
    ^\s*ip\s+default-network$ |
    ^\s*ip\s+default-gateway$ |
    ^\s*ip\s+subnet-zero$ |
    ^\s*ip\s+cef\s*$
)+''', re.MULTILINE | re.VERBOSE)

注意,我添加了VERBOSE标志,这样可以让正则表达式的书写更整洁、更易读。此外,你会看到有几个^$符号。这就是多行正则表达式的工作原理,它允许你在一个文件中跨多行进行匹配。

另外,我必须提醒你,这个正则表达式只是用来检查文件是否格式正确。如果你想从这个文件中提取数据,你需要稍微修改一下这个正则表达式,以满足你的需求。

第二种代码变体

import re

regex = re.match(r'''(^
    \s*
    (clns|bfd|ip)
    \s+
    (routing|graceful-restart|default-network|default-gateway|subnet-zero|cef)
$)+''', re.MULTILINE | re.VERBOSE)

撰写回答