使用子函数替换字符串

时间:2016-11-05 21:54:22

标签: r regex

我试图从数据库中的一列中提取NBA球员的名字。但是,names列中名称的格式如下:

" LeBron James \\ jamesle01"

我在子函数中使用了以下正则表达式来尝试仅保留名称部分:

sub("([A-Z]\\w+\\s*-*'*[a-z]*\\s*\\.*|[A-Z]\\.\\s*)\\*\\*[a-z]*\\d*\\d*", replacement = "\\1", x = nba_salaries$Names)

该表达式旨在考虑包含不仅仅是字母数字字符的不寻常名称(例如Michael Kidd-Gilchrist,De' Andre Jordan,Luc Mbah a Moute等)

但是,当我运行以下内容时,

head(nba_salaries$Names)

名称最终采用相同的格式。

我使用了regexr.com来确保正则表达式正确捕获字符串。

1 个答案:

答案 0 :(得分:1)

这个怎么样,你可以用“\\”字符串拆分文本,然后只取第一个元素:

text <- c( "LeBron James\\jamesle01", "Michael Jordan\\jamesle01" )

sapply( strsplit( text, "\\\\" ), "[", 1 )

哪个给出了

[1] "LeBron James"   "Michael Jordan"

解释。 “[”是一个函数*,在sapply内被调用。因此,我们将strsplit的结果作为X sapply传递给[,并使用参数1text <- strsplit( text, "\\\\" ) 函数应用于*,以获取第一个元素。这是另一种说法:

1

这将输出一个列表,每个列表元素包含一个向量,其中第一个元素是“\\”字符串之前的文本,第二个元素包含其后的任何文本。然后我们使用“[”函数*,传递参数text <- sapply( X = text, FUN = "[", 1 ) ,以获取每个向量的第一个元素:

magrittr

编辑添加,我个人喜欢使用library( magrittr ) text <- strsplit( x = text, split = "\\\\" ) %>% sapply( FUN = "[", 1 ) 管道来做这样的事情,只是为了让它更具可读性:

[]
  • “[”函数是使用vector[1:3]进行子集时调用的函数。例如:vector[1]或在这种情况下SELECT product_service_id, product_service_name, product_service_category_name FROM products_services JOIN product_service_categories ON products_services.product_service_category_id = product_service_categories.product_service_category_id WHERE products_services.company_id = '7' ORDER BY product_service_category_name, product_service_name (感谢@MathewLundberg提出的建议)