Python XML正则表达式匹配问题

时间:2012-10-27 17:19:02

标签: python xml regex

我一直在尝试仅匹配标记名称(没有<>符号)是常规标记的情况:

<w:tag w:attrib1="http://url" w:attrib2="anyValue">

没有匹配的独奏标签(开 - 关标签):

<w:tag2 w:attrib1="anyValue" w:attrib2="http://url" />

(请注意属性中的网址,因为它们包含正斜杠(/))

但无法通过以下方式实现目标:

regex = re.compile('(?<=<)w:\w+(?=[\w\W]+>)(?!\s/>)')

print(regex.findall(string))

得到这个:

['w:tag','w:tag2']

期待这个:

['w:tag']

有什么想法吗?

干杯。

2 个答案:

答案 0 :(得分:1)

1)在前瞻/后视上轻松一点;它们很难控制,你很少真正需要它们。使用捕获组来提取匹配字符串的一部分。使用负字符类和非贪婪搜索(如果需要)以避免匹配太多:

re.findall(r'<\s*(w:\w+)[^>]*(?<!/)>', string)

更容易阅读,不是吗?然而,

2)根本不要这样做!不要依赖RE匹配XML或HTML,你只是要求心碎。有关详细信息,请参阅https://stackoverflow.com/a/1732454/699305。 :-)熟悉使用python的xml.etree.ElementTree代替xpath表达式。这需要一些时间来适应,但是花费时间 - 你不会后悔。

答案 1 :(得分:0)

找到它:

regex = re.compile('(?<=<)w:\w+(?=>)|(?<=<)w:\w+(?=[\s\w+:\w+="[\w/:.-]+"]{0,10}>)')