【问题标题】:R regex to parse token after @ also with no additional tokens in stringR 正则表达式在 @ 之后解析令牌,字符串中也没有额外的令牌
【发布时间】:2014-07-25 01:15:06
【问题描述】:

我在解析文本字符串中的地址时遇到问题。通常的地址将是“@address token token token”或“@address token token /ntoken”。

string <- c("@address token token token", "@address token token /ntoken")
gsub("^\\.?@([a-z0-9_]{1,25})[^a-z0-9_]+.*$", "\\1", string)

正确解析的

[1] "address" "address"

然而,在某些情况下,地址将是字符串中的唯一标记,然后正则表达式将返回包含@的地址

string <- c("@address token token token", "@address token token /ntoken", "@address")
gsub("^\\.?@([a-z0-9_]{1,25})[^a-z0-9_]+.*$", "\\1", string)
# [1] "address"  "address"  "@address"

如何指示正则表达式也管理一个令牌唯一的情况?

【问题讨论】:

    标签: regex r gsub


    【解决方案1】:

    在某些情况下,地址将是字符串中的唯一标记,然后正则表达式将返回包含@的地址

    因为在这种情况下没有匹配项。

    只需稍作改动:

    [^a-z0-9_]+ 转换为[^a-z0-9_]? 以使其可选

    ^\.?@([a-z0-9_]{1,25})[^a-z0-9_]?.*$
    

    这里是Online demo

    【讨论】:

      【解决方案2】:

      使用单词边界:

      gsub("^\\.?@([a-z0-9_]{1,25})\\b.*$", "\\1", string)
      

      【讨论】:

        【解决方案3】:

        使用gsubfn package 中的strapplyc 可以大大简化正则表达式。这将返回与括号内正则表达式部分匹配的正则表达式部分:

        library(gsubfn)
        string <- c("@address token token token", "@address token token /ntoken", 
           "@address")
        
        strapplyc(string, "@([a-z0-9_]{1,25})", simplify = TRUE)
        ## [1] "address" "address" "address"
        

        【讨论】:

          【解决方案4】:

          你可以使用:

          library(stringr)
           str_extract(string, perl('(?<=@)[a-z0-9_]{1,25}'))
          #[1] "address" "address" "address"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-06-16
            • 2013-03-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-14
            • 1970-01-01
            相关资源
            最近更新 更多