正则表达式将字符串拆分为相同的块

时间:2016-10-28 05:34:48

标签: python regex

我想使用python中的regex从下面的XML获取数据并将其放入列表中,如下所示

[['ip-address','1.1.1.1/16','protocol','ospf','ll',4],['ip-address','3.3.3.3/32','ip-addr','2.2.2.2','ip-addr','8.8.8.8','type',route]]

a=''' <att>
       <rt>
        <rts>
         <ip-address>1.1.1.1/16</ip-address>
         <bb>
          <cc>
           <protocol>ospf</protocol>
          </cc>
         </bb>
         <ee>
          <ff>
           <ll>4</ll>
          </ff>
         </ee>
        </rts>
        <rts>
         <ip-address>3.3.3.3/32</ip-address>
         <bb>
          <cc>
           <ip-addr>2.2.2.2</ip-addr>
           <ip-addr>8.8.8.8</ip-addr>
          </cc>
         </bb>
         <ee>
          <ff>
           <type>route</type>
          </ff>
         </ee>
        </rts>
       <rt>
      </att>'''

我的方法是将上面的单个字符串分成多个字符串然后搜索,例如

  b=  '''<rts>
         <ip-address>1.1.1.1/16</ip-address>
         <bb>
          <cc>
           <protocol>ospf</protocol>
          </cc>
         </bb>
         <ee>
          <ff>
           <ll>4</ll>
          </ff>
         </ee>
        </rts>'''

 c= '''<rts>
         <ip-address>3.3.3.3/32</ip-address>
         <bb>
          <cc>
           <ip-addr>2.2.2.2</ip-addr>
           <ip-addr>8.8.8.8</ip-addr>
          </cc>
         </bb>
         <ee>
          <ff>
           <type>route</type>
          </ff>
         </ee>
        </rts>'''

我使用以下正则表达式创建多个字符串

regex = re.findall(r"<(rts)>.*<\ /rts)", a, re.S)

但它会取出所有直到字符串的结尾,如下所示,

        <rts>
     <ip-address>1.1.1.1/16</ip-address>
     <bb>
      <cc>
       <protocol>ospf</protocol>
      </cc>
     </bb>
     <ee>
      <ff>
       <ll>4</ll>
      </ff>
     </ee>
    </rts>
    <rts>
     <ip-address>3.3.3.3/32</ip-address>
     <bb>
      <cc>
       <ip-addr>2.2.2.2</ip-addr>
       <ip-addr>8.8.8.8</ip-addr>
      </cc>
     </bb>
     <ee>
      <ff>
       <type>route</type>
      </ff>
     </ee>
    </rts>

有没有办法可以将字符串除以上面显示的“b”和“c”?

1 个答案:

答案 0 :(得分:1)

使用lxml和xpath,您可以比滚动自己的正则表达式解析器更轻松地解析xml。

以下是一个例子:

int

这将打印第一个rts标签的第一个IP地址,即1.1.1.1/16。

注意: 我需要修复你的xml,最后一个rt标签上有/缺失。