【问题标题】:Remove characters before first and after second underscore extracting string between first and second underscore删除第一个和第二个下划线之前和之后的字符提取第一个和第二个下划线之间的字符串
【发布时间】:2018-06-20 09:41:02
【问题描述】:

我正在使用

gsub(".*_","",ldf[[j]]),1,nchar(gsub(".*_","",ldf[[j]]))-4)

创建要写入的路径和文件名。它适用于lfd 中只有一个下划线的名称。如果文件名后面有另一个下划线,它将切断第二个下划线前面的所有内容。

例如,我有: Arof_07122016_2.csv 我想要07122016,但我得到2。但我不明白为什么会这样。如何使用此行仅切断第一个下划线中的字符并保留第二个下划线?

【问题讨论】:

    标签: r regex gsub


    【解决方案1】:

    看来你想要

    sub("^[^_]*_([^_]*).*", "\\1", ldf[[j]])
    

    regex demo

    模式匹配

    • ^ - 字符串开头
    • [^_]* - 除了_ 之外的 0+ 个字符
    • _ - 一个underascxore
    • ([^_]*) - 捕获组 #1:除 _ 之外的任何 0+ 个字符
    • .* - 字符串的其余部分。

    替换模式中的\1 仅将捕获的值保留在结果中。

    R demo:

    v <- c("Arof_07122016_2.csv", "Another_99999_ccccc_2.csv")
    sub("^[^_]*_([^_]*).*", "\\1", v)
    # => [1] "07122016" "99999" 
    

    【讨论】:

    • 问题的标题有点误导。如果有_ 的其他实例,OP 想要删除字符串的其余部分。如果您实际上正在寻找在第一个_之前删除字符。那么这个工作:^[^_]*_(.*)regex101.com/r/B8gqIi/2
    【解决方案2】:

    正则表达式重复默认是贪婪的,如?regex中所述:

    默认情况下重复是贪心的,所以最大可能的次数 使用重复。可以通过附加 ? 将其更改为“最小”?到 量词。 (还有更多的量词允许近似 匹配:参见 TRE 文档。)

    所以你应该使用模式".*?_"。但是,gsub 将进行多次匹配,因此您最终会得到相同的结果。要解决此问题,请使用 sub,它只会匹配 1 次,或者通过在正则表达式中使用 ^ 来指定要在字符串的开头进行匹配。

    sub(".*?_","","Arof_07122016_2.csv")
    [1] "07122016_2.csv"
    gsub("^.*?_","","Arof_07122016_2.csv")
    [1] "07122016_2.csv"
    

    【讨论】:

    • 正则表达式默认是贪婪的是错误的,或者至少是误导性的陈述。查看您自己在引用中提供的内容:默认情况下,重复是贪婪的 - 量词可以是贪婪的或懒惰的。
    • @WiktorStribiżew 好的,我已经澄清这个选项是关于重复的
    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 2017-08-08
    • 2018-03-17
    • 2014-03-23
    • 2021-02-15
    • 2021-10-15
    • 2022-01-06
    • 2019-12-22
    相关资源
    最近更新 更多