我需要解析一些XML,以提取嵌入式模板标签以进行进一步的解析.不过,我似乎无法弯曲Python的正则表达式来执行我想要的操作.
用英语:当行中的任何位置包含模板标记时,请删除该特定行的所有XML,仅将模板标记保留在其位置.
我整理了一个测试用例进行演示.这是原始的XML:
Header 1
Header 2
Header 3
{% for i in items %}
{{ i.field1 }}
{{ i.field2 }}
{{ i.field3 }}
{% endfor %}
这是期望的结果:
Header 1
Header 2
Header 3
{% for i in items %}
{{ i.field1 }}
{{ i.field2 }}
{{ i.field3 }}
{% endfor %}
这是一些我正在测试的python代码:
#!/usr/bin/env python
import re
f = open( 'regex_trial.xml', 'r' )
orig_xml = f.read()
f.close()
p = re.compile( '
{%.*?%}).*?', re.DOTALL )new_xml = p.sub( '\g', orig_xml, 0 )
print new_xml
此正则表达式的实际结果是:
{% for i in items %}
{% endfor %}
任何帮助是极大的赞赏!如果能够弄清楚这一点,我们将能够从Django支持的站点动态地动态生成MS Word docx文件.谢谢!!
更新:这是我使用的最终代码
from xml.etree import ElementTree
import cStringIO as StringIO
TEMPLATE_TAG = 'template_text'
tree = ElementTree.parse( 'regex_trial.xml' )
rows = tree.getiterator('tr')
for row in rows:
for cell in row.getiterator('t'):
if cell.text and cell.text.find( '{%' ) >= 0:
template_tag = cell.text
row.clear()
row.tag = TEMPLATE_TAG
row.text = template_tag
break
output = StringIO.StringIO()
tree.write( output )
xml = output.getvalue()
xml = xml.replace('' % TEMPLATE_TAG, '')
xml = xml.replace('%s>' % TEMPLATE_TAG, '')
print xml
感谢您的所有帮助!