我一直在尝试仅匹配标记名称(没有<
和>
符号)是常规标记的情况:
<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']
有什么想法吗?
干杯。
答案 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}>)')