gregexpr
并且regmatches
正如 Dason 的回答中所建议的,允许在字符串中提取正则表达式模式的多个实例。此外,该解决方案具有完全依赖{base}
R 包而不需要额外包的优点。
尽管如此,我还是想建议一个基于stringr 包的替代解决方案。一般来说,这个包通过提供基本 R 的各种字符串支持函数的大部分功能(不仅仅是与正则表达式相关的函数),通过一组直观命名的函数并提供一致API。事实上,stringr 函数不仅取代了基本的 R 函数,而且在许多情况下还引入了额外的特性;例如,stringr 的正则表达式相关函数对字符串和模式都进行了矢量化。
专门针对在长字符串中提取多个模式的问题,可以使用str_extract_all
和str_match_all
,如下图所示。根据输入是单个字符串或它的向量这一事实,可以使用列表/矩阵下标unlist
或其他方法(如lapply
等)调整逻辑sapply
。关键是 stringr 函数返回的结构可用于访问我们想要的。
# simulate html input. (Using bogus html tags to mark the target texts; the demo works
# the same for actual html patterns, the regular expression is just a bit more complex.
htmlInput <- paste("Lorem ipsum dolor<blah>MATCH_ONE<blah> sit amet, purus",
"sollicitudin<blah>MATCH2<blah>mauris, <blah>MATCH Nr 3<blah>vitae donec",
"risus ipsum, aenean quis, sapien",
"in lorem, condimentum ornare viverra",
"suscipit <blah>LAST MATCH<blah> ipsum eget ac. Non senectus",
"dolor mauris tellus, dui leo purus varius")
# str_extract() may need a bit of extra work to remove the leading and trailing parts
str_extract_all(htmlInput, "(<blah>)([^<]+)<")
# [[1]]
# [1] "<blah>MATCH_ONE<" "<blah>MATCH2<" "<blah>MATCH Nr 3<" "<blah>LAST MATCH<"
str_match_all(htmlInput, "<blah>([^<]+)<")[[1]][, 2]
# [1] "MATCH_ONE" "MATCH2" "MATCH Nr 3" "LAST MATCH"