Регулярное выражение Python слишком жадное, пропускает первое вхождение в XML

У меня есть следующее регулярное выражение 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


person ncemami    schedule 04.03.2012    source источник
comment
xml_parse = re.search(... аааааааррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррррр!!!! -- Перейдите по этой ссылке.   -  person Rik Poggi    schedule 04.03.2012
comment
Пожалуйста, используйте lxml   -  person Burhan Khalid    schedule 04.03.2012
comment
В чем разница между желаемой и нежелательной группами, кроме отсутствия у вас привязанности к одной из них?   -  person Burhan Khalid    schedule 04.03.2012
comment
Ввод, по-видимому, должен быть XML, но то, что показано, имеет неправильный формат.   -  person mzjn    schedule 04.03.2012
comment
Мне нужно только первое вхождение (лучший результат), поэтому вся последующая информация не имеет значения.   -  person ncemami    schedule 04.03.2012
comment
Простой ответ: не используйте регулярные выражения для разбора XML. Вот для чего нужны парсеры XML.   -  person Michael Kay    schedule 04.03.2012


Ответы (1)


Хм, XML и регулярное выражение. Выглядит забавно.

Как насчет того, чтобы использовать встроенную XML-библиотеку Python, например 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

Серьезно, вы избавите себя от многих головных болей. Regex не предназначен для разбора XML.

person Jordan    schedule 04.03.2012
comment
Кстати, встроенное ElementTree находится в xml.etree.ElementTree. - person Lukáš Lalinský; 04.03.2012
comment
get() для получения атрибутов. Во входных данных нет атрибутов (даже не правильно сформированных). - person mzjn; 04.03.2012
comment
Спасибо за рекомендацию, я не уверен, работает ли ваш код именно для того типа синтаксического анализа, который я делаю, но я использовал его в качестве руководства для кода, который я добавил выше. - person ncemami; 04.03.2012