我正在尝试使用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-26
:
gsub(".*([^.]+)[_]{2}.*","\\1", "Count_pen_test1_2018-03-26_13-19.csv")
它给出了整个字符串"Count_a_test1_2018-03-26_13-19.csv"
我尝试了不同的方法,但我仍然无法获得我想要的东西。
提前感谢您的帮助,祝您有个愉快的一天。
答案 0 :(得分:1)
答案 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
仅划分那里有趣的部分。