我在解析文本字符串中的地址时遇到问题。通常的地址是" @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"
如何指示正则表达式还管理仅一个令牌的情况?
答案 0 :(得分:2)
在某些情况下,地址将是字符串中唯一的标记,然后正则表达式将返回包含@
的地址
因为在那种情况下没有匹配。
稍作改动:
将[^a-z0-9_]+
转换为[^a-z0-9_]?
,使其可选。
^\.?@([a-z0-9_]{1,25})[^a-z0-9_]?.*$
答案 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"