匹配模式,只要它不包含特定字符串

时间:2019-07-10 14:55:01

标签: r regex regex-lookarounds

假设我有以下字符串:

quiz.1.player.chat_resultspartner_quiz.1.player.chat_results

我有成百上千个这样的字符串,唯一的区别是一个以“ partner”为前缀,而另一个则没有。我正在尝试匹配一个而不是另一个。

我要匹配的特定模式如下:

index <- grep('^(quiz.)[1-5]{1}.player.chat_results', names(data))

但这将匹配两个字符串。我猜我必须像这样使用一些否定的前瞻:

^((?!partner).) 

但是我不确定在哪里使用它。

5 个答案:

答案 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*

Regex demo | R demo

例如

regmatches(txt1,regexpr("\\b(?!partner)quiz\\.[1-5]\\.player\\S*",txt, per=TRUE))