首页 > 解决方案 > 如何改进跳过两个单词之一的正则表达式?

问题描述

我有一个文本,我想将所有comprata、comprate、comprati、comprato 更改comprat+并将所有ricomprata、ricomprate、ricomprati、ricomprato 更改ricomprat+。所以我写了这个正则表达式,但它跳过了两个词之一:

testo <- 'ricomprate uno comprato comprata due comprate ricomprate tre ricomprato comprati'
base::gsub('(\\s|^)(ri|)comprat[aeio](\\s|)', '\\1\\2comprat+\\3', testo)

结果是:

"ricomprat+ uno comprat+ comprata due comprat+ ricomprate tre ricomprat+ comprati"

标签: rregexgsub

解决方案


作为一种模式,您可以使用

\b((?:ri)?comprat)[aeio]\b
  • \b防止部分匹配的单词边界
  • (捕获组 1\\1在替换中称为)
    • (?:ri)?可选匹配ri
    • comprat匹配comprat
  • )关闭组 1
  • [aeio]匹配任何列出的字符
  • \b一个词的边界

正则表达式演示| R 演示

在替换使用组 1 和+

testo <- 'ricomprate uno comprato comprata due comprate ricomprate tre ricomprato comprati'
base::gsub('\\b((?:ri)?comprat)[aeio]\\b', '\\1+', testo)

输出

[1] "ricomprat+ uno comprat+ comprat+ due comprat+ ricomprat+ tre ricomprat+ comprat+"

推荐阅读