У меня есть следующее регулярное выражение 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
Почему это происходит? Поскольку я получаю желаемую группу № 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")
Обнаружена следующая ссылка, полезная для конкретных примеров синтаксического анализа XML NCBI BLAST: http://www.dalkescientific.com/writings/NBN/elementtree.html
xml_parse = re.search(...
аааааааррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррр!!!! -- Перейдите по этой ссылке. - person Rik Poggi   schedule 04.03.2012