我有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
现在我可以尝试在字符串中的最后一个字母后分隔字符串。我怎么做?我明白我所做的是糟糕的编码练习(选择将字符串分成两半)。有更聪明的方法吗?
我有一份所有州的清单。我可以将它用作字典来分割字符串吗?
答案 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")