【问题标题】:Regular Expressions Capturing Groups正则表达式捕获组
【发布时间】:2018-03-11 07:44:59
【问题描述】:

我正在尝试从 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(string, pattern, opts_regex = opts(pattern)) 中的错误:Unicode 属性不正确。 (U_REGEX_PROPERTY_SYNTAX)

我的猜测是这个错误与正则表达式模式有关,但使用文档和网络搜索,我一直无法破译它。

【问题讨论】:

    标签: r regex stringr


    【解决方案1】:

    当前代码存在几个问题:

    • (?#:...) 是 cmets,仅当您将 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"
    

    【讨论】:

      【解决方案2】:

      如果我们需要一个字符串输出

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

      如果我们需要单独使用它

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-24
        • 1970-01-01
        • 2018-09-08
        • 2021-06-01
        • 2021-09-06
        相关资源
        最近更新 更多