Шаблон соответствия, если он не содержит конкретной строки - PullRequest
2 голосов
/ 10 июля 2019

Допустим, у меня есть следующие строки:

quiz.1.player.chat_results и partner_quiz.1.player.chat_results

У меня есть сотни таких строк, единственное отличие которых состоит в том, что одна имеет префикс "partner"а другой нет.Я пытаюсь сопоставить одну, но не другую.

Конкретный шаблон, который я хотел бы сопоставить, выглядит так:

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

Но это будет соответствовать обеим строкам.Я предполагаю, что должен использовать какой-то негативный взгляд, например, так:

^((?!partner).) 

Но я не уверен, где его использовать.

Ответы [ 5 ]

7 голосов
/ 10 июля 2019

Я отвечу на ваш заглавный вопрос, так как он будет наиболее полезным для других людей, которые найдут этот вопрос.

Как сопоставить строки, которые не содержат данный шаблон?Легко, сопоставьте шаблон и инвертируйте его.

index <- grep('^partner', names(data), invert = TRUE)
2 голосов
/ 10 июля 2019

Другой подход: используйте str_detect из stringr

> 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
1 голос
/ 10 июля 2019

Если вы хотите сопоставить шаблон, включая цифры, вы можете использовать границу слова \b, за которой следует отрицательный прогноз (?!partner), чтобы утверждать, что непосредственно справа не является партнером.

Примечание: экранируйте точку, чтобы буквально соответствовать ей, и вы можете опустить {1}. Если вы не представляете ценность для захваченной группы вокруг теста, вы также можете ее опустить.

Для сопоставления с остальной частью строки вы можете использовать \S+, чтобы сопоставить не символ без пробела.

\b(?!partner)quiz\.[1-5]\.player\S*

Regex demo | R демо

Например

regmatches(txt1,regexpr("\\b(?!partner)quiz\\.[1-5]\\.player\\S*",txt, per=TRUE))
1 голос
/ 10 июля 2019

Для кого-то, кто немного слеп, как я, sub может помочь,

sub('_.*', '', x) == 'partner'
#[1]  TRUE FALSE
1 голос
/ 10 июля 2019

Мы можем использовать два grepl, чтобы избежать путаницы

grepl('quiz', names(data)) & !grepl('partner', names(data))
#[1]  TRUE FALSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...