假设我有以下字符串:
quiz.1.player.chat_results
和
partner_quiz.1.player.chat_results
我有成百上千个这样的字符串,唯一的区别是一个以“ partner”为前缀,而另一个则没有。我正在尝试匹配一个而不是另一个。
我要匹配的特定模式如下:
index <- grep('^(quiz.)[1-5]{1}.player.chat_results', names(data))
但这将匹配两个字符串。我猜我必须像这样使用一些否定的前瞻:
^((?!partner).)
但是我不确定在哪里使用它。
答案 0 :(得分:7)
我将回答您的标题问题,因为这对于其他人找到此问题最有用。
如何匹配不包含给定模式的字符串?容易,匹配模式并将其反转。
index <- grep('^partner', names(data), invert = TRUE)
答案 1 :(得分:2)
另一种方法:使用Stringr中的str_detect
> library(stringr)
> str_detect(string, "partner", negate=TRUE)
[1] TRUE FALSE
您甚至可以使用一个grepl
来取反结果
> !grepl("partner", string)
[1] TRUE FALSE
只是为了好玩:您可以使用分隔符\\.
或_
分割字符串,然后遍历结果列表中的每个元素,将每个元素与partner
进行比较,最后反转结果
> sapply(strsplit(string, "\\.|_"), function(x) !"partner" %in% x)
[1] TRUE FALSE
答案 2 :(得分:1)
我们可以使用两个$ cat tst.awk
NR==1 { print $0, "NewCol"; next }
{
new = sep = ""
n = split($6,f,/[|]/)
for (i=1; i<=n; i++) {
if ( f[i] ~ /,1/ ) {
new = new sep f[i]
sep = "|"
}
}
print $0, new
}
$ awk -f tst.awk file
ID ANNOTATION OR PVAL VAR_INFO INFO_TAGS_USED_TO_ANNOTATE INFO_TAGS_USED_TO_ANNOTATE NewCol
1 ANN1 1.66 0.0028 1:154837796(1.12e-06,0) 1:154834092(1.49e-05,0)|1:154834911(1.2e-05,1)| 1:155008318(0.000201,0)|1:155008973(0.000177,0)| 1:154834911(1.2e-05,1)
1 ANN1 1.66 0.0028 3:53707953(1.21e-06,0) 3:53708850(1.68e-06,1)|3:53711735(8.52e-07,1)| |3:53765419(0.0021,0)| 3:53708850(1.68e-06,1)|3:53711735(8.52e-07,1)
1 ANN1 1.66 0.0028 12:109966662(6.723e-06,0) 12:109888779(3.01e-05,0)|12:109889704(5.242e-05,0)|12:109890955(4.79e-05,0)| 12:110105520(NA,0)|12:110132792(0.00015,0)|12:110155571(3.93e-05,0)|
以避免混淆
grepl
答案 3 :(得分:1)
对于像我这样对正则表达式有点盲的人,iloc
可以提供帮助,
df1 = df.iloc[0:3]
df2 = df.iloc[4:8]
答案 4 :(得分:1)
如果要匹配包括数字在内的模式,则可以使用单词边界\b
,后跟否定的(?!partner)
来断言直接在右边的不是伙伴。
注意对点进行转义以使其在字面上匹配,您可以省略{1}
。如果您不是测验中所捕获的组的值,也可以忽略它。
要匹配其余字符串,可以使用\S+
来匹配非空格字符。
\b(?!partner)quiz\.[1-5]\.player\S*
例如
regmatches(txt1,regexpr("\\b(?!partner)quiz\\.[1-5]\\.player\\S*",txt, per=TRUE))