我有一些類似以下的文字:
foo_text <- c(
"73000 PARIS 74000 LYON",
"75 000 MARSEILLE 68483 LILLE",
"60 MARSEILLE 68483 LILLE"
)
我想在第一個單詞之后將每個元素一分為二。預期輸出:
"73000 PARIS" "74000 LYON" "75000 MARSEILLE" "68483 LILLE" "60 MARSEILLE" "68483 LILLE"
注意原文中兩個元素之間的空格數不一定相同(例如PARIS和74000之間的空格數與MARSEILLE和68483之間的空格數不相同)。此外,有時第一個數字中有空格(例如 75 000),有時沒有(例如 73000)。
我試圖調整這個答案,但沒有成功:
(delimitedString = gsub( "^([a-z] ) (.*) ([a-z] )$", "\\1,\\2", foo_text))
知道怎么做嗎?
uj5u.com熱心網友回復:
我們可以嘗試strsplit如下使用:
foo_text <- c(
"73000 PARIS 74000 LYON",
"75 000 MARSEILLE 68483 LILLE",
"60 MARSEILLE 68483 LILLE"
)
output <- unlist(strsplit(foo_text, "(?<=[A-Z])\\s (?=\\d)", perl=TRUE))
output
[1] "73000 PARIS" "74000 LYON" "75 000 MARSEILLE" "68483 LILLE"
[5] "60 MARSEILLE" "68483 LILLE"
此處使用的正則運算式模式表示在以下情況下拆分:
(?<=[A-Z]) what precedes is an uppercase letter
\\s split (and consume) on one or more whitespace characters
(?=\\d) what follows is a digit
uj5u.com熱心網友回復:
另一種可能的解決方案,基于tidyverse:
library(tidyverse)
foo_text <- c(
"73000 PARIS 74000 LYON",
"75 000 MARSEILLE 68483 LILLE",
"60 MARSEILLE 68483 LILLE"
)
foo_text %>%
str_split("(?<=[:alpha:])\\s (?=\\d)") %>% flatten %>%
str_remove_all("(?<=\\d)\\s (?=\\d)")
#> [1] "73000 PARIS" "74000 LYON" "75000 MARSEILLE" "68483 LILLE"
#> [5] "60 MARSEILLE" "68483 LILLE"
uj5u.com熱心網友回復:
您正在使用一個^([a-z] ) (.*) ([a-z] )$帶有gsub錨定的模式,并在字串的開頭和結尾匹配一個字符 [az],這不考慮數字,并且由于錨點而無法匹配同一字串中的多個部分。
對于您的示例資料,您還可以匹配第一部分中包含數字和空格的所有部分,然后是 1 個或多個沒有數字的部分。
library(stringr)
s <- c(
"73000 PARIS 74000 LYON",
"75 000 MARSEILLE 68483 LILLE",
"60 MARSEILLE 68483 LILLE"
)
unlist(str_match_all(s, "\\b\\d[\\d\\s]*(?:\\s [^\\d\\s] ) "))
輸出
[1] "73000 PARIS" "74000 LYON" "75 000 MARSEILLE" "68483 LILLE"
[5] "60 MARSEILLE" "68483 LILLE"
請參閱R 演示和正則運算式演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/388491.html
