R正则表达式中的负向前瞻

时间:2016-06-06 12:14:01

标签: regex r

我有一个文字地点:

milestone

我想只从这个字符串中提取坐标,而不包括“500”,因为它不是坐标的一部分;它指的是距离海岸的距离。

我已经编写了这个更通用的正则表达式命令来提取具有相似模式的坐标,最后我有一个负向前瞻,因此不包括实际距离的数字。

这有效:

locality <- "NEAR HAENA BEACH PARK, N 22 13 W 159 34 500 meters from coast"

但我遗漏了北方和西方的参考资料。如果我想要拾取那些N和W字母,这将不再正常工作:

> capture <- gregexpr("([0-9]*\\.?[0-9]+)?(\\$O)?(\\s)?[0-9]*\\.?[0-9]+(\\')?(\\$O)?\\s([0-9]*\\.?[0-9]+(\\')?)(?!\\sMI\\b|KM\\b|M\\b|MILES|KILOMETERS|METERS)", locality, ignore.case = TRUE, perl = TRUE)
> regmatches(locality, capture)
[[1]]
[1] " 22 13"  " 159 34"

换句话说,通过在正则表达式的开头添加> capture <- gregexpr("(N(\\s|\\b)|S(\\s|\\b)|E(\\s|\\b)|W(\\s|\\b))([0-9]*\\.?[0-9]+)?(\\$O)?(\\s)?[0-9]*\\.?[0-9]+(\\')?(\\$O)?\\s([0-9]*\\.?[0-9]+(\\')?)(?!\\sMI\\b|KM\\b|M\\b|MILES|KILOMETERS|METERS)", locality, ignore.case = TRUE, perl = TRUE) > regmatches(locality, capture) [[1]] [1] "N 22 13" "W 159 34 500" ,前瞻不再有效。我认为前瞻只适用于它前面括号中的那一块。

为了扩展这一点,我在评论中加入了一个建议,并在这个地方包含了许多变体,我希望这个正则表达式能够处理。

(N(\\s|\\b)|S(\\s|\\b)|E(\\s|\\b)|W(\\s|\\b))

看起来有几个方面无效。在第二个地方,秒数没有被提升。此外,前瞻不应该影响最后一个位置,但确实如此(但这可能与秒相同)。

1 个答案:

答案 0 :(得分:0)

可能你可以试试这个

location_N <- which(strsplit(locality, "\\s")[[1]]=="N")
stringr::word(locality,location_N,location_N+5)