Python findall и регулярные выражения
Я анализирую xml-файл (называемый ниже xml), в котором есть строки двух разных типов:
1. <line a="a1" b="b1" c="c1">
2. <line a="a2" c="c2">
Я пытаюсь вытащить a2 и c2 только из второго типа, однако это регулярное выражение также захватывает первый тип:
>>> list = re.findall('<line a="(.*)" c="(.*)">', xml)
>>> print(list)
[('a1" b="b1', 'c1'), ('a2', 'c2')]
Как бы я захватил только второй тип?
2 ответа
Решение
Оператор * по умолчанию жадный. Попробуйте ([^"]*) вместо (.*)
Это имеет гораздо больше смысла с правильной библиотекой XML-разбора, такой как ElementTree, вместо использования регулярных выражений. Например:
>>> xmlstr = """\
... <root>
... <line a="a1" b="b1" c="c1"></line>
... <line a="a2" c="c2"></line>
... </root>
... """
>>> import xml.etree.ElementTree as ET
>>> root = ET.XML(xmlstr)
>>> root.findall('./line')
[<Element 'line' at 0x226db70>, <Element 'line' at 0x226de48>]
>>> filtered = [line for line in root.findall('./line') if line.get('b') is None]
>>> for line in filtered:
... print ET.tostring(line)
...
<line a="a2" c="c2" />
>>>