按字符

时间:2016-07-11 15:07:59

标签: regex r string split

我有50个这种形式的字符串:

 28 North Dakota 0 2 1 0 0 1 1 0 0 _1 _2 _1 0 0 0 0 1 0 0 0 0 2 16 F 9.5610957 11

我想在州名后分隔字符串。 (将字符串拆分为最后一个字符)但是有字符' F'靠近字符串的末尾。所以我用这个将字符串分成两半:

substring(x,1,nchar(x)/2)

现在我离开了:

28 North Dakota 0 2 1 0 0 1 1 0 0 _1 _2 _1

现在我可以尝试在字符串中的最后一个字母后分隔字符串。我怎么做?我明白我所做的是糟糕的编码练习(选择将字符串分成两半)。有更聪明的方法吗?

我有一份所有州的清单。我可以将它用作字典来分割字符串吗?

2 个答案:

答案 0 :(得分:1)

我们可以str_split使用n选项。环视正则表达式意味着我们将分割一个或多个空格,该空格位于数值之前并且成为一个字符。当我们将'n'选项指定为2时,它将在找到此模式的第一个实例中拆分以给出两个拆分。

library(stringr)
str_split(str1, "(?<=[a-z])\\s+(?=[0-9])", n = 2)[[1]]
#[1] "28 North Dakota"                                             
#[2] "0 2 1 0 0 1 1 0 0 _1 _2 _1 0 0 0 0 1 0 0 0 0 2 16 F 9.5610957 11"

或者不是使用包解决方案,我们也可以在创建分隔符后使用strsplit

strsplit(sub("(.*[a-z])\\s(.*)", "\\1,\\2", str1), ",")[[1]]
[1] "28 North Dakota"            
[2] "0 2 1 0 0 1 1 0 0 _1 _2 _1 0 0 0 0 1 0 0 0 0 2 16 F 9.5610957 11"

如果我们需要第一部分。我们匹配一个或多个空格(\\s+)后跟一个数字(\\d),后跟字符到字符串末尾(.*)并替换为''。< / p>

sub("\\s+\\d.*", "", str1)
#[1] "28 North Dakota"

如果我们只需要国家

library(stringr)
str_extract(str1, "[A-Za-z]+\\s*[A-Za-z]+")
#[1] "North Dakota"

注意:OP提到了在州名后拆分。

数据

 str1 <- "28 North Dakota 0 2 1 0 0 1 1 0 0 _1 _2 _1 0 0 0 0 1 0 0 0 0 2 16 F 9.5610957 11"

答案 1 :(得分:1)

以下是使用gsub的方法:

gsub("^\\d+ ([A-Za-z ]+) \\d+.*", "\\1", temp)
"North Dakota"

开头的正则表达式表示匹配一个数字作为第一个字符“^ \ d”,可能多于一个数字“+”,后跟一个空格“”。然后捕获“()”下一组字母字符“[A-Za-z] +”以及空格。然后匹配一个空格,后跟至少一个数字“\ d +”和“。*”之后的任何内容,“\ 1”返回捕获的子表达式。

要返回子字符串的最后一部分,可以将捕获括号移动到正则表达式的相应部分。

gsub("^\\d+ [A-Za-z ]+ (\\d+.*)", "\\1", temp)
[1] "0 2 1 0 0 1 1 0 0 _1 _2 _1 0 0 0 0 1 0 0 0 0 2 16 F 9.5610957 11"

或捕获状态名称及其前面的数字,

gsub("^(\\d+ [A-Za-z ]+) \\d+.*", "\\1", temp)
[1] "28 North Dakota

示例字符串:

temp <- c("28 North Dakota 0 2 1 0 0 1 1 0 0 _1 _2 _1 0 0 0 0 1 0 0 0 0 2 16 F 9.5610957 11")