首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从R中的字符串中提取数字和文本

从R中的字符串中提取数字和文本
EN

Stack Overflow用户
提问于 2016-06-18 23:57:23
回答 2查看 278关注 0票数 0

我有一个字符串,想要提取第一组的三个数字和任意三个字母旁边的每个数字,然后放入一个向量。所以这个:

代码语言:javascript
运行
复制
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将成为:

代码语言:javascript
运行
复制
"3-4 cm", "5.6 m", "10m"

我查找了各种正则表达式函数,如grep、grepl等,但找不到与我的查询相匹配的示例。有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2016-06-19 00:05:18

您可以尝试这个正则表达式[0-9.-]+\\s+[a-zA-z]{1,3},并使用stringr包中的str_extract_all提取它们:

代码语言:javascript
运行
复制
stringr::str_extract_all(t1, "[0-9.-]+\\s+[a-zA-Z]{1,3}")
[[1]]
[1] "3-4 cm" "5.6 m"  "10 m"
票数 1
EN

Stack Overflow用户

发布于 2016-06-19 00:27:20

下面是如何使用gregexpr()+regmatches()来完成这一任务

代码语言:javascript
运行
复制
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和埃姆达什):

代码语言:javascript
运行
复制
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"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37902675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档