Python findall和正则表达式

Python findall和正则表达式,python,regex,findall,Python,Regex,Findall,我正在解析一个xml文件(下面称为xml),该文件包含两种不同类型的行: 1. <line a="a1" b="b1" c="c1"> 2. <line a="a2" c="c2"> 1。 2. 我试图仅从第二种类型中提取a2和c2,但是此正则表达式也捕获第一种类型: >>> list = re.findall('<line a="(.*)" c="(.*)">', xml) >>> print(list) [('a1"

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

1. <line a="a1" b="b1" c="c1">
2. <line a="a2" c="c2">
1。
2.
我试图仅从第二种类型中提取a2和c2,但是此正则表达式也捕获第一种类型:

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

如何仅捕获第二种类型?

使用适当的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" />

>>>
>xmlstr=”“”\
... 
...   
...   
... 
... """
>>>将xml.etree.ElementTree作为ET导入
>>>root=ET.XML(xmlstr)
>>>root.findall('./行')
[, ]
>>>filtered=[如果line.get('b')为None,则root.findall('./line')中的行对应于行]
>>>对于已筛选的行:
...     打印ET.tostring(行)
...
>>>

使用适当的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" />

>>>
>xmlstr=”“”\
... 
...   
...   
... 
... """
>>>将xml.etree.ElementTree作为ET导入
>>>root=ET.XML(xmlstr)
>>>root.findall('./行')
[, ]
>>>filtered=[如果line.get('b')为None,则root.findall('./line')中的行对应于行]
>>>对于已筛选的行:
...     打印ET.tostring(行)
...
>>>

默认情况下,*运算符是贪婪的。尝试([^”]*)而不是(.*)

默认情况下,*运算符是贪婪的。尝试([^”]*)而不是(.*)

为什么首先要使用正则表达式解析XML?它们不完全是规则的。。。例如,您查看过库吗?为什么首先要使用正则表达式解析XML?它们不完全是规则的。。。比如说,你看过这个库了吗?我在timeit上运行了它,正则表达式的速度大约快了50倍。因此,如果速度很重要,您知道您在寻找什么,您知道您得到的是什么类型的xml,那么使用正则表达式可能是更好的选择,而不是以可维护性和可读性为代价。还有一个实现相同API的
cElementTree
,但在本机C中作为扩展模块。但是,如果速度对您来说非常重要,那么首先为什么要使用Python呢?;-)也感谢您提供此方法。它将对我正在处理的其他一些任务有用。我通过timeit运行了它,正则表达式解决方案的速度大约快了50倍。因此,如果速度很重要,您知道您在寻找什么,您知道您得到的是什么类型的xml,那么使用正则表达式可能是更好的选择,而不是以可维护性和可读性为代价。还有一个实现相同API的
cElementTree
,但在本机C中作为扩展模块。但是,如果速度对您来说非常重要,那么首先为什么要使用Python呢?;-)也感谢您提供此方法。它将对我正在进行的其他任务有用。