正则表达式正向后视,包括所有以单词开头的单词
Regex positive lookbehind including all words preceded by word
我在 R 中使用 stringr
包,我想替换单词 except 之后的所有值用 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 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+
如果您想匹配 non-whitespace 个字符的任何块,可以将 \w
替换为 \S
。
图案详情
(?:\G(?!^)\s+|\bexcept\s+)
- 匹配整个单词 except
及其后的任何 1+ 个空白字符 (\bexcept\s+
) 或 (|
) 上一次匹配的结尾(\G(?!^)\s+
) 之后的 1+ 个空白字符
\K
- 清除匹配值
\w+
- 匹配 1 个以上的字符 (\S+
) 将匹配任何 1 个或多个 non-whitespace 个字符)
这是一个带有 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
后跟尾随 space 或 space 传递,第二个 y
是字符串的其余部分。 (它通过扫描函数体,即公式的右侧,并提取自由变量来确定参数的名称和数量。)然后它使用 gsub
替换 [=14= 中的每个单词] 与 MATCH
。在正则表达式中,\s
匹配 space,\S
匹配 non-space。 .*
匹配从那时起的所有内容。保留了原来的间距,只用了比较简单的正则表达式。
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"
我在 R 中使用 stringr
包,我想替换单词 except 之后的所有值用 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 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+
如果您想匹配 non-whitespace 个字符的任何块,可以将 \w
替换为 \S
。
图案详情
(?:\G(?!^)\s+|\bexcept\s+)
- 匹配整个单词except
及其后的任何 1+ 个空白字符 (\bexcept\s+
) 或 (|
) 上一次匹配的结尾(\G(?!^)\s+
) 之后的 1+ 个空白字符
\K
- 清除匹配值\w+
- 匹配 1 个以上的字符 (\S+
) 将匹配任何 1 个或多个 non-whitespace 个字符)
这是一个带有 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
后跟尾随 space 或 space 传递,第二个 y
是字符串的其余部分。 (它通过扫描函数体,即公式的右侧,并提取自由变量来确定参数的名称和数量。)然后它使用 gsub
替换 [=14= 中的每个单词] 与 MATCH
。在正则表达式中,\s
匹配 space,\S
匹配 non-space。 .*
匹配从那时起的所有内容。保留了原来的间距,只用了比较简单的正则表达式。
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"