#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. Это изменяет исходный текст. Вы не должны этого делать.