首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式将字符串拆分成相同的块

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

Stack Overflow用户
提问于 2016-10-28 13:34:48
回答 1查看 78关注 0票数 1

我想使用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]]

代码语言:javascript
复制
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>'''

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

代码语言:javascript
复制
  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>'''

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

代码语言:javascript
复制
regex = re.findall(r"<(rts)>.*<\ /rts)", a, re.S)

但它获取所有内容,直到字符串的末尾,如下所示,

代码语言:javascript
复制
        <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”?

EN

回答 1

Stack Overflow用户

发布于 2016-10-28 16:22:37

与使用自己的regex解析器相比,使用lxml和xpath可以更容易地解析xml。

下面是一个例子:

代码语言:javascript
复制
import lxml
import StringIO

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>'''   

f = StringIO.StringIO(a)
tree = lxml.etree.parse(f)

rts = tree.xpath('//rts')

ipa = rts[0].xpath(".//ip-address")[0]

print ipa.text

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40298671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档