R 正则表达式正向查找,包括前面有单词的所有单词
我正在使用R中的R 正则表达式正向查找,包括前面有单词的所有单词,r,regex,stringr,R,Regex,Stringr,我正在使用R中的stringr包,希望用匹配替换紧跟一词的所有值。我得到一个错误,它指出“。必须有一个有界的最大长度(U_REGEX_LOOK_BEHIND_LIMIT)”。以下是引发错误的代码: strings <- c(" wholesale trade except motor vehicles motorcycles", " retail trade except motor vehicles motorcycles") str_replace_
stringr
包,希望用匹配替换紧跟一词的所有值。我得到一个错误,它指出“。必须有一个有界的最大长度(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')
注意,某些字符串将有更多的匹配项要替换
谢谢 您可以将基本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"
基本上,模式是
(?:\G(?!^)\s+|\bexcept\s+)\K\w+
看
如果要匹配任何非空白字符块,可以将\w
替换为\S
图案细节
(?:\G(?)\s+|\beexcept\s+
-匹配整个单词,但不匹配
及其后的任何1+空格字符(\beexcept\s+
)或(
)上一次匹配结束时(\G(?)\s+
)后的1+空格字符
\K
-清除匹配值
\w+
-匹配1+个单词字符(\S+
)将匹配任何1个或多个非空白字符)
您可以将base 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"
基本上,模式是
(?:\G(?!^)\s+|\bexcept\s+)\K\w+
看
如果要匹配任何非空白字符块,可以将\w
替换为\S
图案细节
(?:\G(?)\s+|\beexcept\s+
-匹配整个单词,但不匹配
及其后的任何1+空格字符(\beexcept\s+
)或(
)上一次匹配结束时(\G(?)\s+
)后的1+空格字符
\K
-清除匹配值
\w+
-匹配1+个单词字符(\S+
)将匹配任何1个或多个非空白字符)
这里是一个带有基R
的元素,其中在“除外”处拆分字符串,将第二个元素中的单词替换为“匹配”,并将其粘贴为第一个元素
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"
这里是一个带有base R
的元素,其中在'except'处拆分字符串,用'MATCH'替换第二个元素中的单词,并用第一个元素粘贴
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
提取除…
之外的部分,并使用匿名函数(以公式表示法)处理该部分。该函数接受两个参数x
和y
,其值为两个捕获组,即正则表达式中的两个括号表达式。第一个参数x
将作为传递,除了
后跟一个或多个尾随空格,第二个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"
这将使用gsubfn
提取除…
之外的部分,并使用匿名函数(以公式表示法)处理该部分。该函数接受两个参数x
和y
,其值为两个捕获组,即正则表达式中的两个括号表达式。第一个参数x
将作为传递,除了
后跟一个或多个尾随空格,第二个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"