我正在使用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 来替换。
谢谢!
答案 0 :(得分: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+
如果要匹配任何非空白字符块,\w
可能会替换为\S
。
模式详情
(?:\G(?!^)\s+|\bexcept\s+)
- 匹配整个单词except
和其后的任何1 +空格字符(\bexcept\s+
)或(|
)上一场比赛结束时1+ (\G(?!^)\s+
)\K
- 清除匹配值\w+
- 匹配1个字母字符(\S+
)将匹配任何1个或多个非空白字符)答案 1 :(得分:3)
以下是一个base R
,其中将字符串拆分为&#39;除了&#39;用&#39; MATCH&#34;替换第二个元素中的单词和第一次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"
答案 2 :(得分:1)
这使用gsubfn
提取except...
部分并使用匿名函数处理(用公式表示法表示)。该函数接受两个参数x
和y
,其值为两个捕获组,即正则表达式中的两个带括号的表达式。第一个参数x
将作为except
传递,后跟尾随空格或空格,第二个y
是字符串的其余部分。 (它通过扫描函数体,即公式的右侧,并提取自由变量来确定参数的名称和数量。)然后使用gsub
替换{{1}中的每个单词与y
。在常规正则表达式MATCH
匹配空格,\s
匹配非空格。 \S
匹配从那一点开始的所有内容。它保留原始间距,仅使用相对简单的正则表达式。
.*