R用sub检索字符串:为什么这不起作用?

时间:2016-12-09 18:05:48

标签: r regex

我想提取部分字符串。字符串是:

> (x <- 'ab/cd efgh "xyz xyz"')
> [1] "ab/cd efgh \"xyz xyz\""

现在,我想先提取第一部分:

> # get "ab/cd efgh"
> sub(" \"[/A-Za-z ]+\"","",x)
[1] "ab/cd efgh"

但我没有成功地提取第二部分:

> # get "xyz xyz"
> sub("(\"[A-Za-z ]+\")$","\\1",x, perl=TRUE)
[1] "ab/cd efgh \"xyz xyz\""

此代码有什么问题?
谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

您的上一个代码段不起作用,因为您将整个匹配重新插入到结果中:(\"[A-Za-z ]+\")$匹配并捕获",1 +个字母和空格,"进入第1组和{替换中的{1}}将其放回原位。

您实际上可以通过删除字符串开头的\1以外的所有字符来获取引号内的最后一部分:

"

请参阅R demo

x <- 'ab/cd efgh "xyz xyz"' sub('^[^"]+', "", x) 此处只会找到并替换一次,它会匹配字符串开头(sub),后跟^以外的1 +字符"否定了角色等级。

答案 1 :(得分:1)

要使其与sub一起使用,您必须匹配整个字符串。帮助文件说

  

对于sub和gsub,返回一个长度相同且属性与x相同的字符向量(在可能强制转换为字符之后)。未替换的字符向量x的元素将保持不变(包括任何声明的编码)。

所以为了让这个与你的正则表达式一起工作,预先安排有时候有风险的捕获“。*”

sub(".*(\"[A-Za-z ]+\")$","\\1",x, perl=TRUE)
[1] "\"xyz xyz\""