Python 使用正则表达式获取XML父标记

Python 使用正则表达式获取XML父标记,python,regex,xml,Python,Regex,Xml,我知道正则表达式并不是从XML文件中提取信息的最佳方式,但在这种情况下,我最好使用正则表达式,因为在我的程序结构中,正则表达式还用于从不同类型的文件(文本、程序代码等)中提取信息 假设我们有以下XML代码: <modules> <Orba_Sheepla> <!-- module version --> <version>0.9.25</version> </Orba_Sheepla

我知道正则表达式并不是从XML文件中提取信息的最佳方式,但在这种情况下,我最好使用正则表达式,因为在我的程序结构中,正则表达式还用于从不同类型的文件(文本、程序代码等)中提取信息

假设我们有以下XML代码:

<modules>
    <Orba_Sheepla>
        <!-- module version -->
        <version>0.9.25</version>
    </Orba_Sheepla>
</modules>

0.9.25
在这种情况下,我需要的是“Orba_Sheepla”。通常,我需要的是标记在
标记
之上的一个级别(即父标记)。同一级别上的标记前后可能有其他标记。我需要确保找到包含
标记的标记(或者更确切地说:标记的名称)

我尝试过不同类型的正则表达式,但似乎写不出正确的正则表达式。我能告诉这些表达式与下面的“tagabc”匹配吗

<TAG ABC>
    anything
    <version>anything</version>
    anything
</THE VERY SAME TAG ABC>

任何东西
任何东西
任何东西
当然,其他解决方案也同样受欢迎


我最好使用正则表达式
我不能在这里使用解析器

您应该使用XML解析器它更简单、更健壮,而且不需要花很大的力气进行重构。在具有
getparent()
函数且XPath 1.0已完全实现的地方使用
lxml

感谢斯特里比雪夫的推荐,这一点值得注意

无论如何,这里有一个变通方法,它适用于最简单的情况(在许多实际例子中都会失败)

  • 如果且仅当XML正确缩进时,您可以用较低的缩进级别捕获下一个结束标记
Regex:

输出:

Orba_-Sheepla

所以,在XML语言中,您需要获取版本节点父标记名,对吗?使用XML解析器将非常简单。是的,我需要父标记,是的,使用解析器将非常简单。但是,如果不改变我的程序的结构以匹配这个特定的情况,我就不能在这里使用解析器。很多人认为正则表达式解决方案效率低下、太不可读或太“脆弱”。不,我怀疑任何人都能正确回答你的问题。使用XML解析器,这是一个前瞻性的解决方案。假设您需要获得其他类似的值,那么,您已经有了一个高度可定制的解决方案。请添加一个编程语言标记,或者关闭问题。这是最接近仍然有效的解决方案:“\\s++\\s++”,但这当然只考虑空格,而不考虑其他标记或注释。但是,当我用.+。这些假设在现实生活中成倍增加。在有
getparent()
函数的地方使用
lxml
,XPath 1.0已经完全实现。我对这种变通方法的支持率很低。事实上,这是一种廉价的变通方法。我认为这已经足够清楚了,尽管我刚刚在答案中添加了这句话。
(?smi)^([ \t]+)<version>.*?^(?!\1)[ \t]*</([^\s>]+)