Python findall和正则表达式

Jef*_*eff 1 python regex findall

我正在解析一个xml文件(下面称为xml),它有两种不同类型的行:

1. <line a="a1" b="b1" c="c1">
2. <line a="a2" c="c2">
Run Code Online (Sandbox Code Playgroud)

我试图仅从第二种类型中拉出a2和c2,但是这个正则表达式也捕获了第一种类型:

>>> list = re.findall('<line a="(.*)" c="(.*)">', xml)
>>> print(list)
[('a1" b="b1', 'c1'), ('a2', 'c2')]
Run Code Online (Sandbox Code Playgroud)

我如何捕获第二种类型?

San*_*nta 7

这对于像ElementTree这样的适当的XML解析库而言更有意义,而不是诉诸正则表达式.例如:

>>> 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" />

>>>
Run Code Online (Sandbox Code Playgroud)


Chr*_*Wue 5

* 运算符默认是贪婪的。试试 ([^"]*) 而不是 (.*)