【问题标题】:Regular expression (regex lookarounds) to detected a certain string not between certain strings (lookahead & lookbehind, word not surrounded by words)正则表达式(正则表达式环视)检测某个字符串不在某些字符串之间(前瞻和后视,单词不被单词包围)
【发布时间】:2019-04-30 16:52:42
【问题描述】:

我试图检测某个字符串的所有出现,该字符串没有被某些字符串包围(使用正则表达式环视)。例如。所有出现的“非洲”,但不是“南非社会”。请参阅下面的简化示例。

#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

问题似乎是正则表达式单独而不是整体评估后向和前瞻。它应该需要两个条件,而不仅仅是一个。

【问题讨论】:

  • 您可以使用:^(?!South African Society$).*\bAfrican\b

标签: r regex regex-lookarounds lookahead lookbehind


【解决方案1】:

(?&lt;!South )African(?! Society) 模式与 African 匹配时,它的前面既没有 South 也没有 Society。如果有SouthSociety 将没有匹配。

有几种解决方案。

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

请参阅regex demo。这里,African 仅当正则表达式引擎在匹配紧跟空格和SocietyAfrican 子字符串之后的位置找不到South African 时才匹配。在African 之后使用此检查比将它移动到单词African 之前更有效(请参阅the (?&lt;!South (?=African Society))African regex demo)。

或者,您可以使用SKIP-FAIL technique

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

another regex demo。在这里,South African Society 首先匹配,(*SKIP)(*F) 使此匹配失败并继续进行下一个匹配,因此African 在除South African Society 之外的所有上下文中都匹配。

【讨论】:

  • 嘿,维克托,你就是那个!多谢。只是我简化问题的一个小插件。在实践中,我需要从我的匹配项中排除很多组织的名称(例如,“African Journal”、“Royal African Society”等)。您认为最有效的编码方式是什么?
  • @MrGISRocker 很高兴为您提供帮助。请考虑接受答案。
  • @MrGISRocker (*SKIP)(*F) 如果您想避免手动模式构建,技术将是最简单的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多