You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在分离文件扩展名时保留数据值中的句点?

如何在分离文件扩展名时保留数据值中的句点?

我完全懂你的困扰——想拆分文件名的时候,sp.里的句点被误当成了分隔符,可你只想让扩展名前的那个句点生效,对吧?这里有两种实用的方法能解决这个问题:

方法一:分步拆分(更直观,易调试)

先把文件名主体和扩展名分开处理,这样能彻底避开sp.里的句点被误拆分的情况:

library(tidyverse)

# 你的原始数据
df <- data.frame(name="Caiman sp. YPM-VP 1000_ver1.ply")

# 第一步:只拆分出扩展名,保留文件名主体里的所有内容
df_processed <- df %>%
  # 用正向预查精准定位扩展名前的句点位置,不会拆分其他句点
  tidyr::separate(col = name, into = c("name_body", "filetype"), sep = "(?=\\.[^.]+$)", remove = FALSE) %>%
  # 第二步:对文件名主体按空格或下划线拆分
  tidyr::separate(col = name_body, into = c("genus", "species", "institution", "number", "version"), sep = " |_")

# 查看最终结果
print(df_processed)

运行后你会看到species列完美保留了sp.,filetype列也正确提取了ply,完全符合你的预期。

方法二:单次拆分(更简洁)

如果想一步到位完成所有拆分,可以把分隔符的正则写得更精准——只把空格、下划线,或者作为扩展名分隔的最后一个句点当成拆分依据:

df %>%
  tidyr::separate(
    col = name,
    into = c("genus", "species", "institution", "number", "version", "filetype"),
    # 分隔符为空格、下划线,或是扩展名前的特定位置
    sep = " |_|(?=\\.[^.]+$)"
  )

小细节解释

  • 正则(?=\\.[^.]+$)是正向预查,它只会匹配「后面跟着句点+非句点字符+字符串结尾」的位置,也就是扩展名前的那个句点位置,不会影响前面sp.里的句点。
  • 你之前的代码sep=" |_|\\."会把所有句点都当成分隔符,自然就把sp.拆成了sp和空值,导致后续拆分结构混乱。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 08:03:11