我试图弄清楚如何克服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))]
我觉得我正在磨练,但我无法确切地知道使用什么语法 - 任何想法?
答案 0 :(得分:2)
如果你匹配的整个字符串应该以{{1}}开头,你应该锚定你的正则表达式:
Signal
您的第一次尝试会在字符串中的任何位置找到^Signal
。
您的第二次尝试与Signal
匹配,因为Signa
表示0或更多。
你的第三次尝试忘了逃避逃跑。
答案 1 :(得分:1)
如果你记得正确保护反斜杠(即两个反斜杠),你的最后一次尝试是有效的:
df[, grep("\\bSignal", colnames(df))]