Регулярное выражение (regex lookarounds) для обнаружения определенной строки, которая не находится между определенными строками (lookahead & lookbehind, слово не окружено словами) - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь обнаружить все вхождения определенной строки, которая не окружена определенными строками (с использованием регулярных выражений).Например.все случаи "африканского", но не "южноафриканского общества".См. Упрощенный пример ниже.

#My example text:
text <- c("South African Society", "South African", 
"African Society", "South African Society and African Society")

#My code examples:
str_detect(text, "(?<!South )African(?! Society)")
#or
grepl("(?<!South )African(?! Society)",  perl=TRUE , text)

#I need:
[1] FALSE TRUE TRUE TRUE 

#instead of:
[1] FALSE FALSE FALSE FALSE

Проблема, по-видимому, заключается в том, что регулярное выражение оценивает взгляд назад и взгляд вперед отдельно, а не в целом.Это должно требовать обоих условий, а не только одного.

1 Ответ

0 голосов
/ 28 ноября 2018

Шаблон (?<!South )African(?! Society) соответствует African, если ему не предшествуют ни South , ни Society.Если есть South или Society, совпадений не будет.

Существует несколько решений.

 African(?<!South African(?= Society))

См. Демонстрационную версию regex .Здесь African сопоставляется, только когда механизм регулярных выражений не находит South African в позиции после сопоставления подстроки African, за которой сразу следует пробел и Society.Использование этой проверки после African более эффективно в случае, если есть более длинные строки, которые не соответствуют шаблону, чем перемещение его перед словом African (см. демонстрационный пример (?<!South (?=African Society))African regex ).

В качестве альтернативы вы можете использовать метод SKIP-FAIL :

South African Society(*SKIP)(*F)|African

См. еще одну демонстрацию регулярных выражений .Здесь South African Society сопоставляется первым, а (*SKIP)(*F) делает это совпадение неудачным и переходит к следующему сопоставлению, поэтому African сопоставляется во всех контекстах, кроме South African Society.

...