Я использую R для обработки строк и хочу идентифицировать строки с определенным корнем слова, которым не предшествует другое слово с определенным корнем слова.
Вот простой игрушечный пример. Скажем, я хотел бы идентифицировать строки, в которых слово «cat / s» не предшествует «dog / s» где-либо в строке.
tests = c(
"dog cat",
"dogs and cats",
"dog and cat",
"dog and fluffy cats",
"cats and dogs",
"cat and dog",
"fluffy cats and fluffy dogs")
Используя этот шаблон, я могу потянуть за ниточки, которые действительно имеют собака перед кошкой:
pattern = "(dog(s|).*)(cat(s|))"
grep(pattern, tests, perl = TRUE, value = TRUE)
[1] "dog cat" "dogs and cats" "dog and cat" "dog and fluffy cats"
У моего отрицательного взгляда назад есть проблемы:
neg_pattern = "(?<!dog(s|).*)(cat(s|))"
grep(neg_pattern, tests, perl = TRUE, value = TRUE)
Ошибка в grep (neg_pattern, tests, perl = TRUE, value = TRUE): недопустимое регулярное выражение
Вдобавок: Предупреждающее сообщение: В grep (neg_pattern, tests, perl = TRUE, value = TRUE): ошибка компиляции шаблона PCRE 'утверждение просмотра назад не имеет фиксированной длины' at ') (cat (s |))'
Я понимаю, что. * Не имеет фиксированной длины, поэтому как я могу отклонить строки, в которых слово «собака» перед словом «кошка» разделено любым количеством других слов?
"^(?!.*dog.*cat).*cat"
- person Wiktor Stribiżew   schedule 01.07.2017grep("dog.*cat", grep("cat", tests, perl = TRUE, value = TRUE), perl = TRUE, value = TRUE, invert=TRUE)
- person G5W   schedule 01.07.2017