用正则表达式在句子中找到xml部分

时间:2017-02-20 15:15:40

标签: python regex

我有这样一句话:

<bpt i="1" type="1" x="1" />und ZF-Getriebe <ept i="1" />TipMatic <ph x="2" type="2" />Lite (&lt;/cf&gt;6AS850, 6AS800, 6AS1000)

我想要一个正则表达式,它将提取xml部分,所以最后句子将是:

__xml__und ZF-Getriebe __xml__TipMatic __xml__Lite (&lt;/cf&gt;6AS850, 6AS800, 6AS1000)

可能的正则表达式是什么?

2 个答案:

答案 0 :(得分:1)

我认为没有任何好方法可以做到这一点 - afaik,正则表达式并不擅长提取XML。可能你最好的选择是使用BeautifulSoup:

from bs2 import BeautifulSoup as BS
xml ="""
 <bpt i="1" type="1" x="1" />und ZF-Getriebe <ept i="1" />TipMatic <ph x="2" type="2" />Lite (&lt;/cf&gt;6AS850, 6AS800, 6AS1000)
 """
 a = BS(xml)
 list(a.strings)
 [u'und ZF-Getriebe ', u'TipMatic ', u'Lite (</cf>6AS850, 6AS800, 6AS1000)\n']

您也可以通过

来浏览列表
 # It adds <html><body> in front of it, so this gets around that
 cl = list(a.children.next().children.next().children)
 cl
 [<bpt i="1" type="1" x="1"></bpt>,
 u'und ZF-Getriebe ',
 <ept i="1"></ept>,
 u'TipMatic ',
 <ph type="2" x="2"></ph>,
 u'Lite (</cf>6AS850, 6AS800, 6AS1000)\n']

您可以检查每个孩子的类型,看它是字符串还是XML。

答案 1 :(得分:1)

假设xml标记始终处于打开 - 关闭状态,这可能会执行您想要的操作。您可以将xml放入其中。

>>> line = '''<bpt i="1" type="1" x="1" />und ZF-Getriebe <ept i="1" />TipMatic <ph x="2" type="2" />Lite (&lt;/cf&gt;6AS850, 6AS800, 6AS1000)'''
>>> import re
>>> pieces = []
>>> pos = 0
>>> for m in re.finditer(r'(<[^\/]+\/>)', line):
...     line[m.span()[0]:m.span()[1]]
...     pieces.append(line[pos:m.span()[0]])
...     pos = m.span()[1]
...     
'<bpt i="1" type="1" x="1" />'
'<ept i="1" />'
'<ph x="2" type="2" />'
>>> pieces.append(line[m.span()[1]:])
>>> pieces
['', 'und ZF-Getriebe ', 'TipMatic ', 'Lite (&lt;/cf&gt;6AS850, 6AS800, 6AS1000)']