你在这里做两种不同的解析,你需要使用两种不同的工具。
首先,您正在解析 XML。为此,您将需要使用 XML 解析器,而不是正则表达式。因为这些元素在功能上是相同的 XML:
<wn20schema:NounSynset rdf:about="&dn;synset-56242" rdfs:label="{saddelmageri_1}">
</wn20schema:NounSysnset>
<wn20schema:NounSynset rdf:about="&dn;synset-56242" rdfs:label="{saddelmageri_1}"/>
<wn20schema:NounSynset rdfs:label="{saddelmageri_1}" rdf:about="&dn;synset-56242"/>
甚至可以想象:
<NounSynset xmlns="my_wn20schema_namespace_urn" C:label='not_of_interest' A:label='{saddelmageri_1}' B:about='&dn;synset-56242'/>
要解析该元素,您需要知道该元素和您感兴趣的属性所属的名称空间的名称,然后使用 XML 解析器来查找它们 - 特别是正确支持 XML 名称空间和 XPath 的 XML 解析器,如lxml。
你最终会得到类似这样的东西来找到你正在寻找的属性(假设这doc
是已解析的 XML 文档,并且以结尾的变量_urn
是包含各种命名空间 URN 的字符串):
def find_attributes(doc):
for elm in doc.xpath('//x:NounSynset', namespaces={'x': wn20schema_namespace_urn}):
yield (elm.get(rdf_namespace_urn + "about"), elm.get(rdfs_namespace_urn + "label"))
现在您可以查看问题的第二部分,即从您拥有的属性值中解析出您需要的值。为此,您将使用正则表达式。要解析about
属性,这可能有效:
re.match(r'[^\d]*(\d*)', about).groups()[0]
它返回找到的第一个数字字符系列。要解析label
属性,您可以使用:
re.match(r'{([^_]*)', label).groups()[0]
label
它返回前导左大括号之后的所有字符,直到但不包括第一个下划线。(就解析label
您发布的第二种形式而言,您还没有发布足够的信息让我猜测要解析的正则表达式是什么样的。)