R正则表达式在@之后解析令牌,而字符串中没有其他令牌

时间:2014-07-25 01:15:07

标签: regex r gsub

我在解析文本字符串中的地址时遇到问题。通常的地址是" @address令牌令牌"或者" @address令牌令牌/ 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"

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

4 个答案:

答案 0 :(得分:2)

  

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

的地址

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

稍作改动:

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

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

这是Online demo

答案 1 :(得分:1)

使用字边界:

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

答案 2 :(得分:0)

使用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"

答案 3 :(得分:0)

您可以使用:

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