R中的正则表达式-在空格之间提取两个字母

时间:2019-02-06 14:44:58

标签: r regex

我正在尝试提取两个空格之间的两个字母-

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

这似乎与我想要的完全相反。

2 个答案:

答案 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)")