<p>用科学记数法处理数字使这变得有点棘手,但用一个精心编写的正则表达式是可能的。希望我的正则表达式在所有数据上都能正确运行。:)</p>
<pre><code>import re
def parse_numstr(s):
''' Convert a numeric string to a number.
Return an integer if the string is a valid representation of an integer,
Otherwise return a float, if its's a valid rep of a float,
Otherwise, return the original string '''
try:
return int(s)
except ValueError:
try:
return float(s)
except ValueError:
return s
pat = re.compile(r'([A-Z_]+)([-+]?[0-9.]+(?:e[-+]?[0-9]+)?)', re.I)
def extract(s):
return dict((k, parse_numstr(v)) for k,v in pat.findall(s))
data = [
'Height_A_B132width_top100.0lengthsimple0.00001',
'Height_A132width_top100lengthsimple1.34e+003',
'test_c4.2E1p-3q+5z123E-2e2.71828',
]
for s in data:
print(extract(s))
</code></pre>
<p><strong>输出</strong></p>
<pre><code>{'Height_A_B': 132, 'width_top': 100.0, 'lengthsimple': 1.0000000000000001e-05}
{'width_top': 100, 'Height_A': 132, 'lengthsimple': 1340.0}
{'q': 5, 'p': -3, 'z': 1.23, 'test_c': 42.0, 'e': 2.71828}
</code></pre>
<hr/>
<p>请注意,我的正则表达式将接受科学记数法中包含多个小数点的格式错误的数字,<code>parse_numstr</code>将作为字符串返回。如果您的数据不包含这种格式错误的数字,这应该不是问题。你知道吗</p>
<p>这里有一个稍微好一点的正则表达式。它只允许一个小数点,但也会接受格式错误的数字,小数点两边都没有数字,如<code>.</code>或<code>.E1</code>等</p>
<pre><code>pat = re.compile(r'([A-Z_]+)([-+]?[0-9]*\.?[0-9]*(?:e[-+]?[0-9]+)?)', re.I)
</code></pre>
<p>另请参见<a href="https://stackoverflow.com/a/658662/4014959">this answer</a>,以获取用科学记数法表示数字的正则表达式。你知道吗</p>