python - 正则表达式将字符串分割成相同的 block

标签 python regex

我想使用 python 中的正则表达式从下面的 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','类型',路由]]

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”?

最佳答案

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

这是一个例子:

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 标签上缺少/。

关于python - 正则表达式将字符串分割成相同的 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40298671/

相关文章:

正则表达式试图在反斜杠/不工作之前匹配所有内容

python - 用到目前为止出现的次数替换字符串的每次出现

regex - 匹配正则表达式对面

javascript - 删除最后一个 '\' 不起作用后的所有内容

Python 性能改进和编码风格

python - 在DataFrame的开头(最左端)插入一列

python - mysqldb编程错误

python - 将生成器函数注释为迭代器的混淆

django - 用于捕获 URL 中所有文件夹(包括正斜杠)的正则表达式模式

Python - Fabric 最多 10 个并行 SSH 连接