<p>您只需使用一个正则表达式来拆分key=value对:</p>
<pre><code>import re
key_value = re.compile('(?P<key>[A-Z]+)=(?P<value>\[^\s=;]+)(?:(?=;)|$)')
</code></pre>
<p>此表达式使用命名组,但如果您觉得更易于阅读,则可以不使用这些组:</p>
^{pr2}$
<p><code>(?:..)</code>组是一个非捕获组;它仅用于标记<code>|</code>或符号应用于什么。该模式匹配<code>=</code>符号之前的大写字符,以及任何<em>非</em>空白、<code>=</code>或<code>;</code>字符,前提是在值后面有一个<code>;</code><em>或</em>。在</p>
<p>这将为每行拆分键和值:</p>
<pre><code>>>> key_value = re.compile('(?P<key>[A-Z]+)=(?P<value>[^\s=;]+)(?:(?=;)|$)')
>>> key_value.findall('Person1\tHEIGHT=60;WEIGHT=100;AGE=22')
[('HEIGHT', '60'), ('WEIGHT', '100'), ('AGE', '22')]
</code></pre>
<p>这很容易就可以变成字典:</p>
<pre><code>>>> dict(key_value.findall('Person1\tHEIGHT=60;WEIGHT=100;AGE=22'))
{'AGE': '22', 'WEIGHT': '100', 'HEIGHT': '60'}
</code></pre>
<p>然后可以使用<a href="http://docs.python.org/2/library/csv.html" rel="nofollow">^{<cd7>}</a>编写这些内容:</p>
<pre><code>import csv
import re
key_value = re.compile('(?P<key>[A-Z]+)=(?P<value>[^\s=;]+)(?:(?=;)|$)')
with open(inputfilename) as infile, open(outputfilename, 'wb') as outfile:
writer = csv.DictWriter(outfile, ('PERSON', 'HEIGHT', 'WEIGHT', 'AGE'), delimiter='\t')
writer.writeheader()
for line in infile:
person = line.split('\t', 1)[0]
row = dict(key_value.findall(line))
row['PERSON'] = person
writer.writerow(row)
</code></pre>
<p>基于真实数据示例的演示:</p>
<pre><code>>>> dict(key_value.findall(' P=0.9626;IPU=.$.+1T.+1T.+;IRF=ncRNA;IUC=UTR3;IGN=NCRNA00115;IGI=NCRNA00115,RP11-206L10.16-001;IET=0;IEO=0;IEN=.;IHT=0;IHVC=0;IHD=.;IHI=.;IHN=.;IDI=.;IDN=.;ITMAF=.;ITAMR=.;ITASN=.;ITAFR=.;ITEUR=.;ITNRB=+A;ISF=.;ISD=.;ISM=.;ISX=.;\n'))
{'ISX': '.', 'ITAMR': '.', 'IDN': '.', 'ISM': '.', 'IDI': '.', 'ISF': '.', 'ISD': '.', 'ITMAF': '.', 'IUC': 'UTR3', 'IGI': 'NCRNA00115,RP11-206L10.16-001', 'ITNRB': '+A', 'IHVC': '0', 'IET': '0', 'ITASN': '.', 'ITEUR': '.', 'ITAFR': '.', 'IEO': '0', 'IEN': '.', 'IGN': 'NCRNA00115', 'IRF': 'ncRNA', 'P': '0.9626', 'IHT': '0', 'IHI': '.', 'IHN': '.', 'IPU': '.$.+1T.+1T.+', 'IHD': '.'}
</code></pre>