1

次の Python 正規表現があります。

xml_parse = re.search(r'^.+?<Hit_accession>(\w+?)</Hit_accession>.+?<Hsp_qseq>(\w+?)</Hsp_qseq>\s+?<Hsp_hseq>(\w+?)</Hsp_hseq>\s+?<Hsp_midline>(.+?)</Hsp_midline>',string,flags=re.DOTALL)

次のテキストの場合:

<?xml version="1.0"?>
 <Hit_accession> Desired Group #1 </Hit_accession>
<Hsp>
 <Hsp_qseq> Desired Group # 2 </Hsp_qseq>
 <Hsp_hseq> Desired Group # 3 </Hsp_hseq>
 <Hsp_midline> Desired Group # 4 </Hsp_midline>
</Hsp>

... way later in the XML string

 <Hit_accession> Undesired Group #1 </Hit_accession>
<Hsp>
 <Hsp_qseq> Undesired Group # 2 </Hsp_qseq>
 <Hsp_hseq> Undesired Group # 3 </Hsp_hseq>
 <Hsp_midline> Undesired Group # 4 </Hsp_midline>
</Hsp>

返されるグループは次のとおりです。
(1) 望ましいグループ #1
(2) 望ましくないグループ #2
(3) 望ましくないグループ #3
(4) 望ましくないグループ #4

なぜこうなった?Desired Group #1 を取得し、貪欲でない .+ を使用しているので? flags=re.DOTALL を使用すると、目的のグループ 2 ~ 4 のいずれもスキップされないことが期待されます。

前もって感謝します。


アップデート:

次のように xml.etree.ElementTree を使用して終了しました。

tree = xml.etree.ElementTree.fromstring(string)
iteration = tree.find("BlastOutput_iterations/Iteration")
hits = iteration.findall("Iteration_hits/Hit")
topHit = hits[0]
accessionNCBI = topHit.findtext("Hit_accession")  

NCBI BLAST 固有の XML 解析の例に役立つ次のリンクが見つかりました: http://www.dalkescientific.com/writings/NBN/elementtree.html

4

1 に答える 1

5

うーん、XML と Regex です。楽しそう。

libxml2 や ElementTree などの組み込みの Python XML ライブラリを使用するのはどうですか?

from xml.etree.ElementTree import ElementTree
doc = ElementTree(file='myfile.xml')

for e in doc.findall('/Hit_accession'):
    print e.get('Hsp_qseq').text

真剣に、あなたは多くの頭痛の種を救うでしょう。正規表現は XML 解析用ではありません。

于 2012-03-04T09:49:34.977 に答える