我有一些文件,每个文件在给定的模式中都有一组行。我想一次匹配这些多行,并对它们进行一些操作,如删除,移动到另一个文件等。
文件中的多行如下所示。
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*$' ]
方括号内的线条可能有所不同。
帮我解决这个问题。
答案 0 :(得分:1)
正如python re
模块documentation所说,您可以将MULTILINE
标志添加到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)