首页 > 解决方案 > 使用正则表达式提取名称和数字

问题描述

我想我在理解 R 中的正则表达式时可能会遇到一些问题。

我需要从样本向量中提取电话号码和姓名,并使用 stringr 包功能创建一个数据框,其中包含姓名和号码的相应列。

以下是我的样本向量。

phones <- c("Ann 077-789663", "Johnathan 99656565",
            "Maria2 099-65-6569 office")

我想出的提取这些的代码如下

numbers <- str_remove_all(phones, pattern = "[^0-9]")
numbers <- str_remove_all(numbers, pattern = "[a-zA-Z]")
numbers <- trimws(numbers)

names <- str_remove_all(phones, pattern = "[A-Za-z]+", simplify = T)

phones_data <- data.frame("Name" = names, "Phone" = numbers)

它不起作用,因为它需要名称中的数字并与电话号码结合。(也不是最佳代码)

在解释完成此任务的最简单方法时,我将不胜感激。

标签: rregexstringr

解决方案


不是正则表达式专家,但是使用stringr包我们可以提取带有可选“-”的数字模式,并将“-”替换为空字符串以提取没有任何“-”的数字。对于名称,我们提取字符串开头的第一个单词。

library(stringr)
data.frame(Name = str_extract(phones, "^[A-Za-z]+"), 
           Number = gsub("-","",str_extract(phones, "[0-9]+[-]?[0-9]+[-]?[0-9]+")))


#       Name    Number
#1       Ann 077789663
#2 Johnathan  99656565
#3     Maria 099656569

如果你想完全坚持stringr我们可以使用str_replace_all而不是gsub

data.frame(Name = str_extract(phones, "[A-Za-z]+"), 
Number=str_replace_all(str_extract(phones, "[0-9]+[-]?[0-9]+[-]?[0-9]+"), "-",""))

#       Name    Number
#1       Ann 077789663
#2 Johnathan  99656565
#3     Maria 099656569

推荐阅读