Регулярное выражение (regex lookarounds) для обнаружения определенной строки не между определенными строками (lookahead & lookbehind, слово не окружено словами)
Я пытаюсь обнаружить все вхождения определенной строки, которая не окружена определенными строками (с использованием регулярных выражений). Например. все случаи "африканского", но не "южноафриканского общества". Смотрите упрощенный пример ниже.
#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 ответ
(?<!South )African(?! Society)
сопоставления с образцом African
когда ему не предшествует ни South
ни Society
, Если там есть South
или же Society
не будет никакого совпадения.
Есть несколько решений.
African(?<!South African(?= Society))
Смотрите демо-версию регулярного выражения. Вот, African
сопоставляется только тогда, когда двигатель регулярных выражений не находит South African
на позиции после сопоставления African
подстрока, за которой сразу следует пробел и Society
, Используя эту проверку после African
более эффективен, если есть более длинные строки, которые не соответствуют шаблону, чем перемещать его перед словом African
(см. (?<!South (?=African Society))African
regex demo).
Кроме того, вы можете использовать технику SKIP-FAIL:
South African Society(*SKIP)(*F)|African
Смотрите другую демонстрацию регулярных выражений. Вот, South African Society
сопоставляется первым, и (*SKIP)(*F)
делает этот матч неудачным и переходит к следующему матчу, поэтому African
сопоставляется во всех контекстах, кроме South African Society
,