字符串的第一位带有单独的字符串,字符串中带有“ *”

时间:2019-10-02 17:15:42

标签: r regex tidyr

我认为这很简单,但是我看不到我所缺少的。我想在第一位数分割字符串。除非字符串中包含非字母数字符号,否则效果很好。救命!

作品:

pet<-c("Dog 100","Cat? 340")
df<-as.data.frame(pet)
df_split<-separate(df, pet, into = c("Animal", "Total"), sep = "(?<=[a-zA-Z])\\s*(?=[0-9])")

第一行效果很好,但第二行未拆分。我要去哪里错了?

2 个答案:

答案 0 :(得分:0)

我们可以使用read.table中的base R

read.table(text = sub("?", "", df$pet, fixed = TRUE), header = FALSE,
  col.names = c("Animal", "Total"))
#    Animal Total
#1    Dog   100
#2    Cat   340

答案 1 :(得分:0)

请注意,对于当前情况,足以用1+个空格分隔,然后在字符串末尾加上1+个数字:

> separate(df, pet, into = c("Animal", "Total"), sep = "\\s+(?=[0-9]+$)")
## =>  Animal Total
## =>    1    Dog   100
## =>    2   Cat?   340

请参见regex demo

但是,一般情况下,在这里使用tidyr::extract要容易得多,因为所需的模式会更加简单:

^(\D*?)\s*(\d.*)

请注意,如果您的字符串可以包含换行符,则需要在模式前面加上(?s),即所谓的DOTALL修饰符,该修饰符允许.匹配ICU模式中的换行符。 / p>

请参见regex demo

正则表达式详细信息

  • ^-字符串的开头
  • (\D*?)-第1组(此处为Animal列):任意0+个非数字符号,应尽可能少
  • \s*-0个或多个空格
  • (\d.*)-第2组(此处为Total列):一个数字,后跟任意0+个字符(如果不使用(?s),则为换行符)可能(*是贪婪的量词)。

R代码段:

library(tidyr)
df_split<-extract(df, pet, into = c("Animal", "Total"), regex="(\\D*)(\\d.*)")
df_split
# =>   Animal Total
# => 1   Dog    100
# => 2  Cat?    340