r语言 - 正则表达式正面查看,包括所有单词前面的单词



我在 R 中使用 stringr 包,并希望替换除单词 MATCH之外的所有单词后面的值。我收到一个错误,指出" . .必须具有有界的最大长度 (U_REGEX_LOOK_BEHIND_LIMIT('。这是我抛出错误的代码:

strings <- c(" wholesale trade  except motor vehicles motorcycles",
             " retail trade  except motor vehicles motorcycles") 

str_replace_all(strings,'(?<=\bexcept\W+)\w+','MATCH')

我想要的输出是:

> strings
[1] " wholesale trade  except MATCH MATCH MATCH"
[2] " retail trade  except MATCH MATCH MATCH" 

请注意,某些字符串将有更多的 MATCH 要替换。

谢谢!

您可以将基本 R 解决方案与 gsub 一起使用:

strings <- c(" wholesale trade  except motor vehicles motorcycles",
             " retail trade  except motor vehicles motorcycles") 
gsub("(?:\G(?!^)\s+|\bexcept\s+)\K\w+", "MATCH", strings, perl=TRUE)
# [1] " wholesale trade  except MATCH MATCH MATCH"
# [2] " retail trade  except MATCH MATCH MATCH"   

请参阅 R 演示。

stringr等效项可以是

> str_replace_all(strings, "(\G(?!^)\s+|\bexcept\s+)\w+", "\1MATCH")
[1] " wholesale trade  except MATCH MATCH MATCH"
[2] " retail trade  except MATCH MATCH MATCH" 

基本上,模式是

(?:G(?!^)s+|bexcepts+)Kw+

请参阅在线正则表达式演示。

如果要

匹配任何非空格字符块,可以将w替换为S

图案详细信息

  • (?:G(?!^)s+|bexcepts+) - 将整个单词except和它后面的任何 1+ 空格字符 ( bexcepts+ ( 或 ( | ( 匹配上一个匹配的末尾,并在 ( G(?!^)s+ 之后匹配 1+ 空格字符
  • K - 清除匹配值
  • w+ - 匹配 1+ 字字符(S+ ( 将匹配任何 1 个或多个非空格字符(

这是一个带有base R的字符串,其中在"except"处拆分字符串,将第二个元素中的单词替换为"MATCH",并用第一个元素paste

sapply(strsplit(strings, "\bexcept\s+"), 
     function(x) paste0(x[1], "except ", gsub("\w+", "MATCH", x[2])))
#[1] " wholesale trade  except MATCH MATCH MATCH" 
#[2] " retail trade  except MATCH MATCH MATCH"   

这使用gsubfn提取except...部分并使用匿名函数(以公式表示法表示(进行处理。 该函数接受两个参数xy,其值是两个捕获组,即正则表达式中的两个括号表达式。 第一个参数x将作为except传递,后跟一个或多个尾随空格,第二个y是字符串的其余部分。 (它通过扫描函数的主体(即公式的右侧(并提取自由变量来确定参数的名称和数量。然后,它使用 gsuby中的每个单词替换为 MATCH 。 在正则表达式中,s匹配空格,S匹配非空格。 从那一刻起,.*匹配所有内容。 它保留原始间距,仅使用相对简单的正则表达式。

library(gsubfn)
gsubfn("( except\s+)(.*)", ~ paste0(x, gsub("\S+", "MATCH", y)), strings)
## [1] " wholesale trade  except MATCH MATCH MATCH" " retail trade  except MATCH MATCH MATCH"   

最新更新