R等价于regexp中MATLAB的'tokens'选项

时间:2016-02-07 11:29:40

标签: regex r matlab

我正在学习regexp并且无法找到与MATLAB的tokens option相当的R:

hstr = '<!comment><a name="752507"></a><b>Default</b><br>';
expr = '<(\w+).*?>.*?</\1>';

[mat,tok] = regexp(hstr, expr, 'match', 'tokens');

mat{:}
ans =
<a name="752507"></a>
ans =
<b>Default</b>

tok{:}
ans = 
    'a'
ans = 
    'b'

在R中实现这一目标的最佳方式是什么?

1 个答案:

答案 0 :(得分:2)

您可以使用stringr库中的str_match_all函数返回所有匹配项和子匹配项(=已捕获的文本)。

> library(stringr)
> hstr = '<!comment><a name="752507"></a><b>Default</b><br>'
> expr = '<(\\w+).*?>.*?</\\1>'
> results = str_match_all(hstr, expr)
> unlist(results[[1]][,2])
[1] "a" "b"
> results
[[1]]
     [,1]                      [,2]
[1,] "<a name=\"752507\"></a>" "a" 
[2,] "<b>Default</b>"          "b" 

如您所见,results中的第1列包含匹配项,第2列包含捕获的子字符串。

还有一个选项可以用基础R抓住它们:

> sapply(regmatches(hstr,gregexpr(expr,hstr))[[1]], function(m) unlist(regmatches(m,regexec(expr,m))))
     <a name="752507"></a>     <b>Default</b>  
[1,] "<a name=\"752507\"></a>" "<b>Default</b>"
[2,] "a"                       "b"  

但请注意regexec不支持PCRE正则表达式。当您需要使用lookarounds或skip-fail动词时,在特定情况下可能会出现问题。