0

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

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

没有匹配的单独标签(开闭标签):

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

(请注意URL,因为它们包含正斜杠 ( /))

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

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

print(regex.findall(string))

得到这个:

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

期待这个:

['w:tag']

有什么想法吗?

干杯。

4

2 回答 2

1

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

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

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

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

于 2012-10-27T21:00:12.123 回答
0

找到了:

regex = re.compile('(?<=<)w:\w+(?=>)|(?<=<)w:\w+(?=[\s\w+:\w+="[\w/:.-]+"]{0,10}>)')
于 2012-10-27T18:00:41.747 回答