我有一个字符串,想要提取第一组的三个数字和任意三个字母旁边的每个数字,然后放入一个向量。所以这个:
t1 <- "The string contains numbers ranging from 3-4 cm and can reach up to 5.6 m long, and sometimes can even reach 10 m."
t1将成为:
"3-4 cm", "5.6 m", "10m"
我查找了各种正则表达式函数,如grep、grepl等,但找不到与我的查询相匹配的示例。有什么建议吗?
发布于 2016-06-19 00:05:18
您可以尝试这个正则表达式[0-9.-]+\\s+[a-zA-z]{1,3}
,并使用stringr
包中的str_extract_all
提取它们:
stringr::str_extract_all(t1, "[0-9.-]+\\s+[a-zA-Z]{1,3}")
[[1]]
[1] "3-4 cm" "5.6 m" "10 m"
发布于 2016-06-19 00:27:20
下面是如何使用gregexpr()
+regmatches()
来完成这一任务
ipartRE <- '\\d+';
fpartRE <- '\\.\\d+';
numRE <- paste0(ipartRE,'(?:',fpartRE,')?');
rangeRE <- paste0(numRE,'(?:\\s*-\\s*',numRE,')?');
pat <- paste0(rangeRE,'\\s*[a-zA-Z]{1,3}\\b');
regmatches(t1,gregexpr(perl=T,pat,t1))[[1L]];
## [1] "3-4 cm" "5.6 m" "10 m"
为了提高人的可读性,我从组件部分逐步构建了regex,但显然不需要这样做。
为了匹配新的模式,我们需要接受第二个数字的替换,它在数字周围使用匹配的括号。我还发现,120(–150) cm
中的破折号不是普通的ASCII连字符,而是一个恩达什,因此我添加了另一个名为dashRE
的预先计算的正则表达式片段,它匹配所有3种常见的破折号类型(ASCII、en dash和埃姆达什):
ipartRE <- '\\d+';
fpartRE <- '\\.\\d+';
numRE <- paste0(ipartRE,'(?:',fpartRE,')?');
dashRE <- '[—–-]';
rangeOptParenRE <- paste0(numRE,'(?:\\s*(?:',dashRE,'\\s*',numRE,'|\\(\\s*',dashRE,'\\s*',numRE,'\\s*\\)\\s*))?');
pat <- paste0(rangeOptParenRE,'\\s*[a-zA-Z]{1,3}\\b');
regmatches(t1,gregexpr(perl=T,pat,t1))[[1L]];
## [1] "3-4 cm" "120(–150) cm" "5.6 m" "10 m"
https://stackoverflow.com/questions/37902675
复制相似问题