我正在学习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中实现这一目标的最佳方式是什么?
答案 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动词时,在特定情况下可能会出现问题。