2012-03-04 38 views
1

我有以下的Python的正則表達式:Python的正則表達式過於貪婪,錯過在XML第一次出現

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

這是怎麼發生的?因爲我得到了希望的組#1並且使用非貪婪。+?與flags = re.DOTALL,我希望它不會跳過任何我想要的組2-4。

在此先感謝。


UPDATE:

結束了使用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

+5

**'xml_parse = re.search(...'** aaaaaaarrrrrggggghhhhh !!!! - 請按照此[鏈接](http://stackoverflow.com/a/1732454/1132524)。 – 2012-03-04 09:47:33

+0

什麼是除了你對一個人不感興趣之外,你希望的和不想要的組之間的區別? – 2012-03-04 09:51:54

+1

輸入顯然應該是XML,但是顯示的內容不是良構。 – mzjn 2012-03-04 10:03:28

回答

5

嗯,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解析。

+0

順便說一句, -in ElementTree在'xml.etree.ElementTree'中。 – 2012-03-04 09:51:57

+0

舊代碼綜合症。Thanks @LukášLalinský – Jordan 2012-03-04 09:53:24

+0

'get()'是for獲取屬性。輸入中沒有屬性(甚至沒有格式良好)。 – mzjn 2012-03-04 10:09:29