删除第一个和第二个下划线之前和之后的字符,提取第一个和第二个下划线之间的字符串。

问题描述 投票:2回答:2

我使用的是

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

创建一个路径和文件名来写入。它对于在 lfd 只有一个下划线的文件名。如果文件名有另一个下划线,那么它就会把第二个下划线前面的所有东西都切掉。

例如,我有这样一个文件名Arof_07122016_2.csv 而我想... 07122016但我得到 2. 但我不明白为什么会发生这种情况。我怎样才能用这一行只剪掉第一个下划线的字符,而保留第二个下划线?

r regex gsub
2个回答
4
投票

看来你想要的是

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

搜索引擎演示

该模式符合

  • ^ - 弦首
  • [^_]* - 0+字符以外的其他字符 _
  • _ - 漏网之鱼
  • ([^_]*) - 捕获组#1:除了0+字符以外的任何0+字符。_
  • .* - 弦的其余部分。

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

R演示:

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

4
投票

正则表达式重复默认是贪婪的,这在下面的文章中解释过。?regex:

默认情况下,重复是贪婪的,所以使用最大可能的重复次数。这可以通过在量化符后添加 ? 来改变为 "最小"。(还有更多的量化符允许近似匹配:参见 TRE 文档。)

所以你应该使用以下模式 ".*?_". 然而, gsub 会进行多次匹配,所以你最终会得到相同的结果。要解决这个问题,请使用 sub 只会进行1次匹配,或者通过使用 ^ 在regex中。

sub(".*?_","","Arof_07122016_2.csv")
[1] "07122016_2.csv"
gsub("^.*?_","","Arof_07122016_2.csv")
[1] "07122016_2.csv"
© www.soinside.com 2019 - 2024. All rights reserved.