1

私はこの正規表現のものを理解するのに苦労しています...

私はこのような文字列を持っています:

<wn20schema:NounSynset rdf:about="&dn;synset-56242" rdfs:label="{saddelmageri_1}">

これを取得するには、findall()とグループを使用します。

['56242','saddelmageri']

数字を「synset-[0-9]」のようなものと一致させ、単語を「{(。*?)}」のようなものと一致させることができますが、上記の結果を得るためにどのように書くのですか?

そして、ここにフォローアップの質問があります-いくつかの行は次のようになります:

<wn20schema:NounSynset rdf:about="&dn;synset-2589" rdfs:label="**{cykel_3: trehjulet cykel; tricykel,1_1}**">

この場合、{}の間にあるものを抽出して次の結果にします。

['2589', ['cykel', 'trehjulet cykel', 'tricykel']]

後でkey(2589):value(['cykel'、'trehjulet cykel'、'tricykel'])ペアとして辞書にドロップできるようにします。

何かご意見は?

4

4 に答える 4

2

この質問のトップアンサーをご覧ください。正規表現を使用してxmlを解析することは一般的にひどい考えです。XMLパーサーは、この目的のために構築されています。

これを行う最も簡単な方法は、おそらくPythonの組み込みミニダムでしょう。

于 2009-12-28T15:46:58.510 に答える
1

これはxmlデータのように見えるため、正規表現を使用してxmlを解析することは非常に困難であるため、xmlパーサーを使用することをお勧めします。

ただし、特に正規表現を求めたので...

仕様は少し不正確であり、正規表現では、一致を構成するものを非常に正確にする必要があります。たとえば、rdfs:label値には、削除する_1が常に含まれますか?これらのデータブロックは1行に1つだけですか、それとも1行に複数ありますか?また、結果の順序は重要ですか?

これがあなたが望むものに近づくかもしれない簡単なハックです:

import re
data=r'<wn20schema:NounSynset rdf:about="&dn;synset-56242" rdfs:label="{saddelmageri_1}">"'

matches=re.findall('synset-([0-9]+).*label="{(.*)_1}"', data)
print "matches:", matches

上記を実行すると、次の出力が得られます。これは、必要な2つの文字列を含む2つのタプルのリストです(順序は異なります)。

matches: [('56242', 'saddelmageri')]
于 2009-12-28T15:47:40.290 に答える
1

このデータで多くのことを行う場合は、特殊なRDFライブラリ(RDFLibなど)も検討してください。そうでない場合は、XMLパーサーが最適です。

  • 明日それが一行にならない場合はどうなりますか?
  • 明日labelが前に来るとしたらabout
  • 有効なXMLを維持しながら正規表現を破る方法は、少なくとも12以上あります。

とにかく、XMLパーサーを適用しようとしましたが、そこで「未定義のエンティティエラー」が発生します&dn;。ファイルの先頭(Doctype、名前空間定義など)を投稿できますか?

于 2009-12-28T16:36:44.823 に答える
1

ここでは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する正規表現がどのようになるかを推測するのに十分な情報を投稿していません。)

于 2009-12-28T16:55:36.297 に答える