Разделить смешанную строку - PullRequest
0 голосов
/ 30 октября 2019

У меня проблемы с разбиением смешанной строки. Рассматриваются две ситуации:

  1. разделить "A1BB2CCC3" на "A1" "BB2" "CCC3".

  2. разделить одно и то же на "A" "1" "BB" "2" "CCC" "3".

Я пытаюсь использовать strsplit(), но я не знаком с синтаксисом regex . Спасибо за любую помощь.

Ответы [ 4 ]

2 голосов
/ 30 октября 2019

Мы можем использовать split дважды и вставить / объединить два, чтобы получить ваши ситуации, т.е.

i1 <- strsplit(x, '[0-9]+')[[1]]
i2 <- strsplit(x, '[A-Z]+')[[1]]

case1 <- paste0(i1, i2[i2 != ''])
case1
#[1] "A1"   "BB2"  "CCC3"

case2 <- c(i1, i2[i2 != ''])
case2
#[1] "A"   "BB"  "CCC" "1"   "2"   "3"  

Если важен порядок в case2, то мы можем использовать Map, то есть

unlist(Map(c, i1, i2[i2 != '']))
# A1    A2   BB1   BB2  CCC1  CCC2 
#"A"   "1"  "BB"   "2" "CCC"   "3" 
1 голос
/ 30 октября 2019

Если вы используете только пакет base, то regmatches и gregexpr могут сделать это:

s <- "A1BB2CCC3"
r1 <- unlist(regmatches(s,gregexpr("([[:alpha:]]+\\d+)",s)))
r2 <- unlist(regmatches(s,gregexpr("([[:alpha:]]+)|(\\d+)",s)))

, где

  • ([[:alpha:]]+\\d+) обозначает форматалфавита (-ов), за которым следуют цифра (-ы) как группа
  • ([[:alpha:]]+)|(\\d+) обозначает формат алфавита (-ов) или цифру (ы) как свои собственные группы соответственно
1 голос
/ 30 октября 2019

Я бы предпочел использовать str_extract_all из пакета stringr. Первое можно сделать:

str_extract_all("A1BB2CCC3","[A-Z]+[0-9]{1}")

[[1]]
[1] "A1"   "BB2"  "CCC3"

Если шаблон читает любое количество букв верхнего регистра [A-Z]+, за которыми следует одно число [0-9]{1}. второй:

str_extract_all("A1BB2CCC3","[A-Z]+|[0-9]")

[[1]]
[1] "A"   "1"   "BB"  "2"   "CCC" "3" 

шаблон - любые заглавные буквы или цифры.

0 голосов
/ 30 октября 2019

Менее красноречив, чем другие ответы - и используя функцию @Sotos Map:

tmp <- "A1BB2CCC3"
combined_elements <- paste0(unlist(strsplit(trimws(gsub("\\d+", " ", tmp), "both"), "\\s+")),

              unlist(strsplit(trimws(gsub("[a-zA-Z]+", " ", tmp), "both"), "\\s+")))

unlist(Map(c, unlist(strsplit(trimws(gsub("\\d+", " ", tmp), "both"), "\\s+")), 
           unlist(strsplit(trimws(gsub("[a-zA-Z]+", " ", tmp), "both"), "\\s+"))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...