【问题标题】:Extract number float in exponential format from a bunch of long paths从一堆长路径中提取指数格式的数字浮点数
【发布时间】:2019-12-14 13:09:59
【问题描述】:

我有很多字符串,每个字符串都对应于文件的路径。我想在每个字符串中提取指数格式的数字。

例如,我有:

../../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 之类的方法,但找不到要使用的方法(findallresearchsub)?

我怎样才能以简单或简短的方式实现这一点(独立于wm_up 子字符串,因为它可能是其他子字符串(例如wm_dw)?

说明

我想提取数字,因为我想按升序对所有这些长字符串进行排序。我想用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

这是natsortedof 路径数组的结果:如您所见,升序考虑了前几位,而不是我想提取的浮点指数值(实际值)。我想按这个值的升序选择。

【问题讨论】:

  • 这能回答你的问题吗? How to extract a floating number from a string
  • @Reanik 我已经更新了我的问题,这没有得到很好的解释。您是否掌握了我想将路径排序为指数浮点数的“真实”值的函数的小技巧?问候
  • 这些名称的唯一区别是浮点数和updw吗?
  • 可以有其他子字符串,如up2up3dw2dw3 ...等等,当然,指数浮点数会有所不同。

标签: python regex regex-group


【解决方案1】:

代码如下:

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))

【讨论】:

  • 非常感谢!如何仅选择路径名而不选择值?元组元素 "(i, path[i])" 在我的代码中创建了问题,因为我正在做进一步的 floats[i] 就像 floats 是一个浮点数数组,但它会产生一个错误......
  • @youpilat13 嗨,我更新了我的答案:),考虑将其标记为正确答案,如果对您有帮助,请点赞
  • 为什么要为排序键创建第二个列表?如果你只是通过 key=function 它工作正常,每个元素只调用一次函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 2018-12-05
  • 1970-01-01
相关资源
最近更新 更多