正则表达式捕获组

时间:2017-09-29 11:50:24

标签: r regex stringr

我试图从R(v3.4.1)中的字符串中提取纬度,经度和标签。我的想法是正则表达式是要走的路,而且由于 stringr 包能够提取捕获组,我认为这是要使用的包。问题是我收到了一个我无法解释的错误。任何帮助,将不胜感激。

以下是我想从中提取信息的字符串示例。我想抓住最后一组纬度(41.505)和经度(-81.608333)以及标签(Adelbert Hall)。

a <- "Case Western Reserve University campus41°30′18″N 81°36′30″W / 41.505°N 81.608333°W / 41.505; -81.608333 (Adelbert Hall)"

这是我为抓取我感兴趣的字段而创建的正则表达式。

coordRegEx <- "([\\d]*\\.\\d*)(?#Capture Latitude);\\h(-\\d*\\.\\d*)(?#Capture Longitude)\\N*\\((\\N*)(?#Capture Label)\\)"

现在,当我尝试使用:

匹配字符串中的正则表达式时
s <- str_match(a,coordRegEx)

我收到以下错误:

  

stri_match_first_regex中的错误(字符串,模式,opts_regex = opts(模式)):不正确的Unicode属性。 (U_REGEX_PROPERTY_SYNTAX)

我的猜测是这个错误与Regex模式有关,但是使用文档和网络搜索,我无法解读它。

2 个答案:

答案 0 :(得分:4)

目前的代码有几个问题:

  • (?#:...)只有在您将x修饰符传递给正则表达式时才允许使用
  • ICU regex library不支持与任何非换行符匹配的\N速记字符(它支持与命名字符匹配的\N{UNICODE CHARACTER NAME})。您可以将\N替换为.

查看您的固定方法:

> a <- "Case Western Reserve University campus41°30′18″N 81°36′30″W / 41.505°N 81.608333°W / 41.505; -81.608333 (Adelbert Hall)"
> coordRegEx <- "(?x)(\\d*\\.\\d*)(?#Capture Latitude);\\h(-\\d*\\.\\d*)(?#Capture Longitude).*\\((.*)(?#Capture Label)\\)"
> s <- str_match(a,coordRegEx)
> s

 [,1]                                         [,2]         [,3]            [,4]           
[1,] "41.505; -81.608333 (Adelbert Hall)" "41.505" "-81.608333" "Adelbert Hall"
  

答案 1 :(得分:1)

如果我们需要字符串输出

sub(".*\\/\\s*", "", a)
#[1] "41.505; -81.608333 (Adelbert Hall)"

如果我们需要它作为单独的

strsplit(sub(".*\\/\\s*", "", a), ";\\s*|\\s*\\(|\\)")[[1]]
#[1] "41.505"        "-81.608333"    "Adelbert Hall"