Python 正则表达式太贪心,错过了 XML 中的第一次出现

标签 python xml regex xml-parsing greedy

我有以下 Python 正则表达式:

xml_parse = re.search(r'^.+?<Hit_accession>(\w+?)</Hit_accession>.+?<Hsp_qseq>(\w+?)</Hsp_qseq>\s+?<Hsp_hseq>(\w+?)</Hsp_hseq>\s+?<Hsp_midline>(.+?)</Hsp_midline>',string,flags=re.DOTALL)

对于以下文本:

<?xml version="1.0"?>
 <Hit_accession> Desired Group #1 </Hit_accession>
<Hsp>
 <Hsp_qseq> Desired Group # 2 </Hsp_qseq>
 <Hsp_hseq> Desired Group # 3 </Hsp_hseq>
 <Hsp_midline> Desired Group # 4 </Hsp_midline>
</Hsp>

... way later in the XML string

 <Hit_accession> Undesired Group #1 </Hit_accession>
<Hsp>
 <Hsp_qseq> Undesired Group # 2 </Hsp_qseq>
 <Hsp_hseq> Undesired Group # 3 </Hsp_hseq>
 <Hsp_midline> Undesired Group # 4 </Hsp_midline>
</Hsp>

返回的组是:
(1) 期望组#1
(2) 不需要的第 2 组
(3) 不需要的第 3 组
(4) 不需要的第 4 组

为什么会这样?因为我得到 Desired Group #1 并使用非贪婪 .+?使用 flags=re.DOTALL,我希望它不会跳过任何我想要的组 2-4。

提前致谢。


更新:

最终使用 xml.etree.ElementTree 如下:

tree = xml.etree.ElementTree.fromstring(string)
iteration = tree.find("BlastOutput_iterations/Iteration")
hits = iteration.findall("Iteration_hits/Hit")
topHit = hits[0]
accessionNCBI = topHit.findtext("Hit_accession")  

发现以下链接对 NCBI BLAST 特定的 XML 解析示例很有用: http://www.dalkescientific.com/writings/NBN/elementtree.html

最佳答案

嗯,XML 和正则表达式。看起来很有趣。

如何使用内置的 Python XML 库,如 libxml2 或 ElementTree?

from xml.etree.ElementTree import ElementTree
doc = ElementTree(file='myfile.xml')

for e in doc.findall('/Hit_accession'):
    print e.get('Hsp_qseq').text

说真的,你会省去很多麻烦。正则表达式不适用于 XML 解析。

关于Python 正则表达式太贪心,错过了 XML 中的第一次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9553857/

相关文章:

c# - 数字字符和 .&- 的正则表达式

python - 何时在 python 中使用运算符重载的经验法则

c# - 具有属性的列表的 XML 序列化

xml - 在 Perl 中解析 XML 文件 - 保留序列

java - JAXB 编码/解码具有 List 变量成员的类对象

mysql - 根的正则表达式和 MySQL 中的一些变体

regex - 在 R 中设置正则表达式选项

python - python 有类似 C++ 的 using 关键字吗?

python - Google 应用程序引擎,python : Google, Facebook,Twitter,OpenID 帐户

python - 在 Windows 上安装 pyspark