Регулярное выражение, соответствующее «dem», но не «демократ» в R

#r #regex

Вопрос:

Я пытаюсь сопоставить определенную подстроку («dem»), но не хочу сопоставлять конкретную строку, содержащую эту подстроку («демократ»). Можно ли это сделать с помощью grep?

Например, у меня есть следующее:

 gt; my_text lt;- c("demRace", "democrat", "demGender") gt; grepl(pattern = "dem", x = my_text) [1] TRUE TRUE TRUE  

И мой желаемый результат таков:

 gt; grepl(pattern = some_pattern, x = my_text) [1] TRUE FALSE TRUE  

Комментарии:

1. Может быть grepl("dem", my_text)amp;!grepl("democrat", my_text)

2. Или grepl(pattern = "dem(?!ocrat)", x = my_text, perl = TRUE) ?

Ответ №1:

Один из подходов использует негативный взгляд:

 my_text lt;- c("demRace", "democrat", "demGender") grepl(pattern = "dem(?!ocrat$).*", my_text, perl=TRUE)  [1] TRUE FALSE TRUE  

Комментарии:

1. .*$ это излишне. grepl не требует полного совпадения строк.

Ответ №2:

Возможное решение:

 my_text lt;- c("demRace", "democrat", "demGender") my_text lt;- my_text[!grepl(pattern = "democrat", x = my_text)] grepl(pattern = "dem", x = my_text)  

ОТРЕДАКТИРОВАНО (чтобы исправить проблемы, указанные ниже Оньямбу)

 my_text lt;- c("demRace", "democrat", "demGender") -gt; tmp tmp[grepl(pattern = "democrat", x = tmp)] lt;- "x" grepl(pattern = "dem", x = tmp)   

Комментарии:

1. Помните, что для демократа нужно быть ФАЛЬШИВЫМ. Это устраняет демократа. так что это неправильно

2. Спасибо, @Onyambu. Хорошая мысль! Однако, если цель операции состоит в том, чтобы собрать совпадающие слова, мой код работает.

3. Посмотрите на желаемые результаты. Тогда вы не заметите, что этот код не отвечает на вопрос

4. Мой отредактированный код теперь выдает ЛОЖЬ, о которой вы упомянули, @Onyambu. Спасибо!

5. Это изменяет исходный текст. Вы не должны этого делать.