我正在尝试提取两个空格之间的两个字母-
AAPL US Equity
1836 JP Equity
APPLE SOMETHING NOT
C US Equity
结果-
US
JP
US
我尝试的是gsub("\\s[A-Z]{2}\\s", "\\1", vec)
,但这给了我-
AAPLEquity
1836Equity
APPLE SOMETHING NOT
CEquity
这似乎与我想要的完全相反。
答案 0 :(得分:1)
我们可以使用sub
out <- rep("", length(vec))
i1 <- grepl("\\b[A-Z]{2}\\b", vec)
out[i1] <- sub(".*\\s+([A-Z]{2})\\s+.*", "\\1", vec[i1])
out
#[1] "US" "JP" "" "US"
或使用str_extract
在空格(由正则表达式环视指定)之后并沿单词边界(\\b
)提取两个大写字符
str_extract(vec, "(?<=\\s)([A-Z]{2})\\b")
#[1] "US" "JP" NA "US"
注意:未从他人的答案中复制语法
vec <- c("AAPL US Equity", "1836 JP Equity", "APPLE SOMETHING NOT", "C US Equity")
答案 1 :(得分:1)
gsub
命令删除与正则表达式匹配的文本部分。 \s[A-Z]{2}\s
查找空格,2个大写ASCII字母和空格的条纹,并将其从字符向量中删除。
您可以使用
x <- c('AAPL US Equity','1836 JP Equity','APPLE SOMETHING NOT','C US Equity')
sub(".*\\s+([A-Z]{2})\\s.*|.*", "\\1", x)
# => [1] "US" "JP" "" "US"
在这里,.*\\s+([A-Z]{2})\\s.*
替代匹配那些在空格之间有两个字母“ word”的输入,并将这些单词放入组1(\1
),而.*
替代匹配所有其他输入作为sub
操作产生空结果。
或者,您可以使用
library(stringr)
str_extract(x, "(?<=\\s)[A-Z]{2}(?=\\s)")
# => [1] "US" "JP" NA "US"
在这里,(?<=\\s)[A-Z]{2}(?=\\s)
匹配并且str_extract
提取字符串,它们是空格之间的前两个字母的单词。
如果单词可以在字符串的开头/结尾使用
str_extract(x, "(?<!\\S)[A-Z]{2}(?!\\S)")