获取带有正则表达式

时间:2015-09-30 08:46:22

标签: python regex xml

我知道正则表达式并不是从XML文件中提取信息的最佳方法,但在这种情况下,使用正则表达式对我来说更好,因为在我的程序结构中它们也习惯于从不同类型的文件(文本,程序代码等)中提取信息。

我们说我们有以下XML代码:

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

我需要的是&#34; Orba_Sheepla&#34;在这种情况下。我需要的是标记高于<version>标记的一个级别(即父标记)。标签在同一级别之前和之后可能存在其他标签。我需要确保找到包含<version>标记的标记(或者更确切地说:标记的名称)。

我尝试过不同类型的正则表达式,但我似乎无法写出正确的表达式。我可以以某种方式告诉表达式匹配&#34; TAG ABC&#34;以下?

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

当然,其他解决方案同样受欢迎!

1 个答案:

答案 0 :(得分:3)

  

标记上一级 <version>
  我最好使用正则表达式   我不能在这里使用解析器

您应该使用XML解析器!它更容易,更强大,并且不应该花费大量精力进行重构。使用lxml您拥有getparent()功能的地方,并完全实施XPath 1.0 感谢stribizhev建议,应该注明

无论如何,这是一个适用于最简单案例的解决方法(在许多现实案例中都会失败)。

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

<强>正则表达式:

(?smi)^([ \t]+)<version>.*?^(?!\1)[ \t]*</([^\s>]+)

捕获组2中的结束标记。
它的作用是:

  • ^([ \t]+) 它捕获
  • 之前的空格
  • <version> 您想要的标签
  • .*?^ 然后找到下一行
  • (?!\1)[ \t]* 缩进较少
  • </([^\s>]+) 并捕获结束标记

<强>代码:

import re

text = '''
<modules>
    <Orba_Sheepla>
        <!-- module version -->
        <version>0.9.25</version>
    </Orba_Sheepla>
</modules>'''

pattern = re.compile( r'^([ \t]+)<version>.*?^(?!\1)[ \t]*</([^\s>]+)', re.I | re.S | re.M)
match = pattern.search(text)

if match:
    print(match.group(2))

<强>输出:

Orba_Sheepla

regex101 Demo ideone Demo