Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 正则表达式正向查找,包括前面有单词的所有单词_R_Regex_Stringr - Fatal编程技术网

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_

我正在使用R中的
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"