ここでは2種類の解析を行っており、2つの異なるツールを使用する必要があります。
まず、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"))
これで、問題の2番目の部分、つまり、所有している属性値から必要な値を解析することができます。そのためには、正規表現を使用します。about
属性を解析するには、これが機能する可能性があります。
re.match(r'[^\d]*(\d*)', about).groups()[0]
これは、見つかった最初の一連の数字を返します。また、属性を解析するlabel
には、次を使用します。
re.match(r'{([^_]*)', label).groups()[0]
label
これは、先頭の左中括弧の後から最初の下線までのすべての文字を返します。(あなたが投稿した2番目の形式を解析する限り、解析label
する正規表現がどのようになるかを推測するのに十分な情報を投稿していません。)