1

2つの異なるタイプの行を持つxmlファイル(以下ではxmlと呼ばれます)を解析しています。

1. <line a="a1" b="b1" c="c1">
2. <line a="a2" c="c2">

2番目のタイプからのみa2とc2をプルしようとしていますが、この正規表現は最初のタイプもキャプチャします。

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

2番目のタイプだけをキャプチャするにはどうすればよいですか?

4

2 に答える 2

8

これは、正規表現に頼るのではなく、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" />

>>>
于 2011-03-19T01:51:31.983 に答える
5

*演算子は、デフォルトでは貪欲です。(。*)の代わりに([^ "] *)を試してください

于 2011-03-19T01:54:51.300 に答える