我正在使用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要替换。
谢谢!
您可以使用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+
如果你想匹配任何非空白字符块,\w
可以用\S
替换。
图案细节
(?:\G(?!^)\s+|\bexcept\s+)
- 匹配整个单词except
和任何1+空白字符后(\bexcept\s+
)或(|
)上一场比赛结束后1+空格字符(\G(?!^)\s+
)\K
- 清除匹配值\w+
- 匹配1 +字chars(\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...
部分并使用匿名函数处理(用公式表示法表示)。该函数接受两个参数x
和y
,其值是两个捕获组,即正则表达式中的两个带括号的表达式。第一个参数x
将作为except
传递,后跟尾随空格或空格,第二个y
是字符串的其余部分。 (它通过扫描函数体,即公式的右侧,并提取自由变量来确定参数的名称和数量。)然后使用gsub
用y
替换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"