用R选择下划线之间的字符串

时间:2018-04-04 02:26:40

标签: r regex string underscore.js selection

我正在尝试使用R
中的正则表达式从字符串test1中选择Count_a_test1_2018-03-26_13-19.csv 在阅读了类似问题的答案后,我尝试了这一点 gsub(".*[_]([^.]+)[_].*", "\\1", "Count_a_test1_2018-03-26_13-19.csv")

它给了我2018-03-26

所以我添加了{2}这样计算两个下划线并选择test1而不是2018-03-26gsub(".*([^.]+)[_]{2}.*","\\1", "Count_pen_test1_2018-03-26_13-19.csv") 它给出了整个字符串"Count_a_test1_2018-03-26_13-19.csv"

我尝试了不同的方法,但我仍然无法获得我想要的东西。

提前感谢您的帮助,祝您有个愉快的一天。

3 个答案:

答案 0 :(得分:1)

请尝试以下对gsub的调用:

gsub("^(?:[^_]+_){2}([^_]+).*", "\\1", x)

Demo

答案 1 :(得分:0)

您是要选择还是替换? gsub用于替换匹配的字符串。

不确定你的其他字符串是什么,所以我假设它们的格式几乎相同count_a_XXXX#_###-##-##_##-##.csv" where X is a letter and#是一个数字。匹配XXX#

gsub("_\\w{4}\\d_", "", "Count_a_test1_2018-03-26_13-19.csv")

如果您想要匹配,我会发现stringr包的效果更好:

library(stringr)
str_match("Count_a_test1_2018-03-26_13-19.csv", "\\w{4}\\d" )
> "test1"

答案 2 :(得分:0)

您的问题是您正在使用贪婪的运算符*作为expressios的第一部分,这意味着它会尽可能地前进。让我们以这种方式重新考虑你的正则表达式:

  • 感兴趣的部分始终以_字符开头,因此您的正则表达式应该开始识别它。
  • 您想要第二个_而不是第一个_[^_]*_([^_]*)_ 。所以第一部分不应该被包括在内。

The next regexp可以为您提供一种可能的方法:

[^_]

如您所见,_表示任何不等于*的字符,而_表示尽可能多地使用((直到下一个))然后,有一个组(在<<<$1>>>res之间)分隔您感兴趣的内容,因此您必须匹配正则表达式,然后选择第一个组。由于演示是匹配和替换,我使用for in仅划分那里有趣的部分。