我有很多字符串,每个字符串对应于文件的路径。
我想在每个字符串中以指数格式提取数字。
例如,我有:
../../Analysis_Pk_vs_Step_BEFORE_NEW_LAUNCH_13_DECEMBRE_22h57/Archive_WP_Pk_der_3_pts_step_7.27168772219203e-07/wm_up
而且我想引出浮点数:7.27168772219203e-07
我想避免使用split
方法(带有_
分隔符)。
所以我尝试使用python regexp
,但找不到使用哪种方法(findall
,research
或sub
)?
[如果有人可以帮助我以简单或简短的方式实现此目标(与wm_up
子字符串无关,因为它可能是其他子字符串(例如,例如wm_dw
))。
UPDATE 1:抱歉,我没有很好地解释所有问题:
我想提取数字,因为我想对所有这些长字符串进行升序排序。我想使用natsorted
:
例如,我有初始字母:
../../Analysis_Pk_vs_Step_BEFORE_NEW_LAUNCH_13_DECEMBRE_22h57/Archive_WP_Pk_der_3_pts_step_9.301510038746646e-06/wm_up
../../Analysis_Pk_vs_Step_BEFORE_NEW_LAUNCH_13_DECEMBRE_22h57/Archive_WP_Pk_der_3_pts_step_9.301510038746646e-06/wm_dw
../../Analysis_Pk_vs_Step_BEFORE_NEW_LAUNCH_13_DECEMBRE_22h57/Archive_WP_Pk_der_3_pts_step_9.437191487625705e-05/wm_up
../../Analysis_Pk_vs_Step_BEFORE_NEW_LAUNCH_13_DECEMBRE_22h57/Archive_WP_Pk_der_3_pts_step_9.437191487625705e-05/wm_dw
这是路径数组的natsorted
的结果:如您所见,升序考虑的是前几位,而不是我要提取的浮点指数的值(实际值)。我想按此值的升序选择。
希望您能理解。
这里是代码:
l = [
'../../Analysis_Pk_vs_Step_BEFORE_NEW_LAUNCH_13_DECEMBRE_22h57/Archive_WP_Pk_der_3_pts_step_9.301510038746646e-06/wm_up',
'../../Analysis_Pk_vs_Step_BEFORE_NEW_LAUNCH_13_DECEMBRE_22h57/Archive_WP_Pk_der_3_pts_step_9.301510038746646e-06/wm_dw',
'../../Analysis_Pk_vs_Step_BEFORE_NEW_LAUNCH_13_DECEMBRE_22h57/Archive_WP_Pk_der_3_pts_step_9.437191487625705e-05/wm_up',
'../../Analysis_Pk_vs_Step_BEFORE_NEW_LAUNCH_13_DECEMBRE_22h57/Archive_WP_Pk_der_3_pts_step_9.437191487625705e-05/wm_dw'
] # the input that we have
# regex from https://stackoverflow.com/a/4703508/7434857
numeric_const_pattern = '[-+]? (?: (?: \d* \. \d+ ) | (?: \d+ \.? ) )(?: [Ee] [+-]? \d+ ) ?'
rx = re.compile(numeric_const_pattern, re.VERBOSE) # compile the regex
l.sort(key=lambda x: (float(rx.findall(x)[-1]),x))