正则表达式正面观察,包括所有以单词开头的单词

问题描述 投票:1回答:3

我正在使用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 regex stringr
3个回答
3
投票

您可以使用gsub的基本R解决方案:

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 demo

一个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+|\bexcept\s+)\K\w+

online regex demo

如果你想匹配任何非空白字符块,\w可以用\S替换。

图案细节

  • (?:\G(?!^)\s+|\bexcept\s+) - 匹配整个单词except和任何1+空白字符后(\bexcept\s+)或(|)上一场比赛结束后1+空格字符(\G(?!^)\s+
  • \K - 清除匹配值
  • \w+ - 匹配1 +字chars(\S+)将匹配任何1个或更多非空白字符)

3
投票

这里有一个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"   

1
投票

这使用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"   
© www.soinside.com 2019 - 2024. All rights reserved.