如何在R中提取字符串中第一次出现的字母?

时间:2017-02-06 06:21:29

标签: r regex

我的字符列的值为"CHELSEAFC17FEB640CE""BARCAFC17FEB1400CE"。我想提取字符"CHELSEAFC""BARCAFC"等等。目前我正在使用 regmatches(x$symbol,regexpr("[A-z]+",x$symbol)) 但得到一个错误:

  

$<-.data.frame*tmp*,“cg”,值= c(“CHELSEAFC”,   “CHELSEAFC”,“TOTTENHAMFC”,:替换有11366767行,数据   有11366772电话:$&lt; - - &gt; $&lt; - .data.frame执行暂停

我似乎无法找到问题行。请有人帮忙调试或建议更好的方法:)

3 个答案:

答案 0 :(得分:1)

假设我们需要提取非数字部分,一个选项是通过匹配一个或多个数字([0-9]+)后跟其他字符(.*)来删除其他字符并替换它与""

sub("[0-9]+.*", "", str1)
#[1] "CHELSEAFC" "BARCAFC" 

或者从字符串的开头(([A-Z]+))将大写字母作为一组(^)捕获,并将其替换为该组的反向引用(\\1

sub("^([A-Z]+).*", "\\1", str1)
#[1] "CHELSEAFC" "BARCAFC" 

数据

str1 <- c( "CHELSEAFC17FEB640CE", "BARCAFC17FEB1400CE")

答案 1 :(得分:1)

而不是[A-z]+您应该使用^[A-Za-z]+检查一下,以便更好地了解您为什么不应该这样做:https://stackoverflow.com/a/29771926/4082217

答案 2 :(得分:0)

出现错误是因为输入向量中有一些不包含字母的值(以及一些symbols that [A-z] matches)。这使得regmatches在没有匹配的情况下不返回任何值,因此,由于匹配数与数据框中的行数不一致,因此无法分配列值。

您可能会做的是:

1)使用sub

x <- c("------", "CHELSEAFC17FEB640CE", "BARCAFC17FEB1400CE")
> sub("^([a-zA-Z]+).*|.*", "\\1", df$x)
[1] ""          "CHELSEAFC" "BARCAFC" 
> 
x$symbol <- sub("^([a-zA-Z]+).*|.*", "\\1", x$symbol)

^([a-zA-Z]+).*|.*模式将匹配并捕获一个或多个ASCII字母(将[a-zA-Z]+替换为[[:alpha:]]+以匹配ASCII以外的字母)在字符串的开头({{ 1}}),^将匹配字符串的其余部分,OR(.*)整个字符串将与第二个分支匹配,匹配将被捕获组内容替换(所以,它将填充字母值或将为空。)

2)如果您想为不匹配的值保留NA,请使用 stringr |

str_extract

请注意,library(stringr) > x$symbol <- str_extract(x$symbol, "^[A-Za-z]+") ## => 1 <NA> ## 2 CHELSEAFC ## 3 BARCAFC 仅匹配字符串开头的1 + ASCII字母(^[A-Za-z]+)([A-Za-z]+)。