7

私が本当に理解していない理由で、私が使用しているREST APIは、JSONまたはXMLを出力する代わりに、独特の構造化テキスト形式を使用しています。最も単純な形で

SECTION_NAME    entry  other qualifying bits of the entry
                entry2 other qualifying bits
                ...

構造が見えるように、これらはタブで区切られていませんが、代わりにスペースで区切られ、修飾ビットにはスペースを含む単語が含まれている場合があります。SECTION_NAMEとエントリの間のスペースも可変で、1から数(6以上)のスペースの範囲です。

また、フォーマットの一部には、フォームのエントリが含まれています

SECTION_NAME entry
  SUB_SECTION more information
  SUB_SECTION2 more information

参考までに、構造の使用法を示す実際のデータの抜粋(一部のセクションは省略)。

ENTRY       hsa04064                    Pathway
NAME        NF-kappa B signaling pathway - Homo sapiens (human)
DRUG        D09347  Fostamatinib (USAN)
            D09348  Fostamatinib disodium (USAN)
            D09692  Veliparib (USAN/INN)
            D09730  Olaparib (JAN/INN)
            D09913  Iniparib (USAN/INN)
REFERENCE   PMID:21772278
  AUTHORS   Oeckinghaus A, Hayden MS, Ghosh S
  TITLE     Crosstalk in NF-kappaB signaling pathways.
  JOURNAL   Nat Immunol 12:695-708 (2011)

この奇妙な形式を何か賢いもの(JSONに変換できる辞書)に解析しようとしているので、どうすればよいかわかりません。スペースを盲目的に分割すると、混乱が発生します(スペースのある情報にも影響します)。セクションがいつ始まるかどうかをどうやって理解できるかわかりません。テキスト操作は仕事に十分ですか、それとももっと洗練された方法を使うべきですか?

編集:

私は仕事にpyparsingを使い始めましたが、複数行のレコードが私を困惑させます。これがDRUGの例です。

 from pyparsing import *
 punctuation = ",.'`&-"
 special_chars = "\()[]"

 drug = Keyword("DRUG")
 drug_content = Word(alphanums) + originalTextFor(OneOrMore(Word(
      alphanums + special_chars))) + ZeroOrMore(LineEnd())
 drug_lines = OneOrMore(drug_content)
 drug_parser = drug + drug_lines

例のDRUGの最初の3行に適用すると、間違った結果が得られます(\ n読みやすくするために実際の結果に変換されます)。

 ['DRUG', ['D09347', 'Fostamatinib (USAN)
        D09348  Fostamatinib disodium      (USAN)
        D09692  Veliparib (USAN']]

ご覧のとおり、後続のエントリはすべてまとめられますが、次のようになります。

 ['DRUG', [['D09347', 'Fostamatinib (USAN)'], ["D09348", "Fostamatinib disodium (USAN)"],
           ['D09692', ' Veliparib (USAN)']]]
4

2 に答える 2

3

パーサーベースのアプローチを使用することをお勧めします。たとえば、目の前のタスクにはPython PLYを使用できます。

于 2012-07-04T08:38:46.743 に答える
0

最善の方法は、次のような正規表現を使用することです。

m = re.compile('^ENTRY\s+(.*)$')
m.search(line)
if m:
   m.groups()[0].strip()

エントリのない行については、最後に検出したエントリを使用する必要があります。

より単純なアプローチは、エントリごとに分割されます。次に例を示します。

vals = line.split('DRUG')
if len(vals) > 1:
     drug_field = vals[1].strip()
于 2012-07-04T08:40:54.010 に答える