在R中,使用正则表达式,我如何区分" Normalized_Signal"和"信号"?

时间:2016-04-30 18:43:17

标签: regex r

我试图弄清楚如何克服R中的贪婪模式匹配。我有一个数据框,我试图浏览每一列并选出那些说'&34;信号& #34; (例如,Signal.1,Signal.2,Signal.3),但不是那些说" Normalized_Signal" (例如,Normalized_Signal.1,Normalized_Signal.2)。

如何使用正则表达式区分这两个字符串?

这就是我现在正在做的事情:

 # create a toy dataframe - I only want the ones that say "Signal.1, Signal.2"
 df <- data.frame( Signal.1 = c(1,1), Normalized_Signal.1 = c(1,1), SDEV.1 = c(1,1), Signal.2 = c(1,1),  Normalized_Signal.2 = c(1,1), SDEV.2 = c(1,1) )

 # attempt 1: pull out all the rows that say "signal" 
 df[, grep("Signal", colnames(df))]

 # attempt 2: grepl
 df[, grepl("Signal*", colnames(df))]

 # attempt 3: add word boundary
 df[, grep("\bSignal", colnames(df))]

我觉得我正在磨练,但我无法确切地知道使用什么语法 - 任何想法?

2 个答案:

答案 0 :(得分:2)

如果你匹配的整个字符串应该以{{1​​}}开头,你应该锚定你的正则表达式:

Signal

您的第一次尝试会在字符串中的任何位置找到^Signal

您的第二次尝试与Signal匹配,因为Signa表示0或更多。

你的第三次尝试忘了逃避逃跑。

答案 1 :(得分:1)

如果你记得正确保护反斜杠(即两个反斜杠),你的最后一次尝试是有效的:

df[, grep("\\bSignal", colnames(df))]