所以我有一个很长的字符串,我想处理多个匹配。我似乎只能使用regexpr
获得第一场比赛的第一个位置。如何在同一个字符串中返回多个位置(更多匹配)?
我在html源代码中寻找一个特定的字符串。拍卖的标题(在html标签之间)。它很难找到:
到目前为止,我使用了这个:
locationstart <- gregexpr("<span class=\"location-name\">", URL)[[1]]+28
locationend <- regexpr("<", substring(URL, locationstart[1], locationend[1] + 100))
substring(URL, locationstart[1], locationstart[1] + locationend - 2)
也就是说,我寻找一个标题之前的部分,然后我抓住那个地方,从那里寻找一个“&lt;”表明标题已结束。我愿意接受更具体的建议。
答案 0 :(得分:5)
使用gregexpr
可以进行多次匹配。
> x <- c("only one match", "match1 and match2", "none here")
> m <- gregexpr("match[0-9]*", x)
> m
[[1]]
[1] 10
attr(,"match.length")
[1] 5
attr(,"useBytes")
[1] TRUE
[[2]]
[1] 1 12
attr(,"match.length")
[1] 6 6
attr(,"useBytes")
[1] TRUE
[[3]]
[1] -1
attr(,"match.length")
[1] -1
attr(,"useBytes")
[1] TRUE
如果您想要提取匹配项,可以使用regmatches
为您完成此操作。
> regmatches(x, m)
[[1]]
[1] "match"
[[2]]
[1] "match1" "match2"
[[3]]
character(0)
答案 1 :(得分:2)
gregexpr
和regmatches
允许在字符串中提取正则表达式的多个实例。此外,此解决方案的优势在于完全依赖于R的{base}
包,而不需要额外的包。
从来没有,我想建议一个基于stringr package的替代解决方案。通常,这个包通过提供基本R的各种字符串支持函数的大部分功能(不仅仅是与正则表达式相关的函数),通过直观命名的一组函数并提供一致性,可以更容易地处理字符串。 API。实际上,字符串函数不仅仅是替换基本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"