r语言 - 正则表达式(正则表达式环顾四周),用于检测不在某些字符串之间的某个字符串(前瞻和后视,单词未被单词包围)



我试图检测某个字符串的所有出现,该字符串没有被某些字符串包围(使用regex查找(。例如,所有出现的"非洲"而不是"南非社会"。请参阅下面的简化示例。

#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

问题似乎是regex分别评估lookbehind和lookahead,而不是作为一个整体。它应该需要两个条件,而不仅仅是一个条件。

(?<!South )African(?! Society)模式在前面既没有South也没有Society时与African匹配。如果存在SouthSociety,则将不存在匹配。

有几种解决方案。

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

请参阅regex演示。这里,只有当正则表达式引擎在匹配紧接着空格和SocietyAfrican子串之后的位置没有找到South African时,才匹配African。在出现与模式不匹配的较长字符串的情况下,在African之后使用此检查比在单词African之前移动它更有效(请参阅(?<!South (?=African Society))Africanregex演示(。

或者,您可以使用SKIP-FAIL技术:

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

请参阅另一个regex演示。这里,首先匹配South African Society,而(*SKIP)(*F)使该匹配失败并进行下一个匹配,因此African在除South African Society之外的所有上下文中都匹配。

最新更新