我知道正则表达式并不是从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>
当然,其他解决方案同样受欢迎!
答案 0 :(得分:3)
标记上一级
<version>
我最好使用正则表达式 我不能在这里使用解析器
您应该使用XML解析器!它更容易,更强大,并且不应该花费大量精力进行重构。使用lxml
您拥有getparent()
功能的地方,并完全实施XPath 1.0
感谢stribizhev建议,应该注明
无论如何,这是一个适用于最简单案例的解决方法(在许多现实案例中都会失败)。
<强>正则表达式:强>
(?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