想要在匹配字符串后打印下一行

时间:2016-05-02 07:37:10

标签: python regex match newline string-matching

我有一个字符串

         ...
         <div class="timeline-footer">
            <a class="btn btn-primary btn-xs">...</a>
         </div>
      </div>
   </li>
   <!-- END timeline item -->
   <li class="empty"></li>
</ul>

从这个字符串中我匹配.timeline { margin-bottom: 0; } .timeline li.empty { line-height: 0; margin-bottom: 0; } 并使用以下内容打印整行:

output = '''Gateway of last resort is not set

      10.0.1.0/8 is variably subnetted, 4 subnets, 2 masks
C        10.1.0.0/24 is directly connected, Ethernet1/0
L        10.1.0.1/32 is directly connected, Ethernet0/0
C        10.2.0.0/24 is directly connected, Ethernet0/1
L        19.18.2.1/32 is directly connected, Serial2/1
O     19.18.3.0/20 [110/128] via 19.18.2.2, 00:00:50, Serial1/1
                     [110/128] via 19.18.1.2, 00:00:50, Serial1/0

O     12.18.3.1/20 [110/128] via 19.18.2.2, 00:00:50, Serial1/1
                     [110/128] via 19.18.1.2, 00:00:50, Serial1/0

O     12.18.1.0/20 [110/128] via 19.18.2.2, 00:00:50, Serial0/1
                     [110/128] via 19.18.1.2, 00:00:50, Serial0/0'''

它输出为:

O

但我想打印这些线以及上面的输出。

regex = re.findall("O\s+(?P<O>\w+.\w+.\w+.\w+.*)", output, re.M)

2 个答案:

答案 0 :(得分:2)

试试这个:

regex = re.findall("(?s)O\s+(?P<O>\w+.\w+.\w+.\w+.*)", output, re.M)

我添加(?s)以添加s标志以匹配空格。

答案 1 :(得分:1)

您可以选择匹配模式后以空格开头的可选行:

O\s+(?P<O>\d+\.\d+\.\d+\.\d+.*(?:[\r\n]+[^\S\r\n]+.*)?)
                              ^^^^^^^^^^^^^^^^^^^^^^^^      

请参阅this regex demo

更新的模式详细信息:(?:[\r\n]+[^\S\r\n]+.*)?是一个可选的非捕获组((?:...)?),匹配1或0次出现的

  • [\r\n]+ - 一个或多个CR / LF符号(仅匹配一个,使用(?:\r?\n|\r|\n)
  • [^\S\r\n]+ - 除非空白和CR / LF之外的1个或多个符号(因此,它仅匹配水平空格
  • .* - 该行的其余部分(.默认情况下与新行不匹配,没有DOTALL模式)。

另外,我建议转发.以匹配IP地址内的字面点,并将\w替换为\d以仅匹配数字。

如果第一个O出现在行的开头,请在其前面添加^以确保安全。