Возможно ли использовать R base::strsplit() без использования шаблона

#r #regex #string

#r #регулярное выражение #строка

Вопрос:

У меня есть строка, которая полностью состоит из простых повторяющихся шаблонов [: digit:] [A-Z], например 12A432B4B.

Я хочу использовать base::strsplit(), чтобы получить:

 [1] "12A" "432B" "4B"
  

Я думал, что мог бы использовать lookahead для разделения на БУКВУ и сохранить этот шаблон с unlist(strsplit("12A432B4B", "(?<=.)(?=[A-Z])", perl = TRUE)) но, как видно, я неправильно разделяю:

 [1] "12"   "A432" "B4"   "B" 
  

Не могу разобраться с шаблоном, который работает с этой стратегией strsplit? Пояснения были бы действительно оценены.

Бонус: мне также не удалось использовать обратную ссылку в gsub (например, — шаблон не работает `gsub(«([[:digit:]]] [A-Z]) «, «\1″, » 12A432B4B»), и можете ли вы получить более групп от \ 1 до \ 9, скажем, если [:digit:] [A-Z] повторяется более 9 раз?

Ответ №1:

Мы можем использовать regex lookaround для разделения между буквой верхнего регистра и цифрой

 strsplit(str1, "(?<=[A-Z])(?=[0-9])", perl = TRUE)[[1]]
#[1] "12A"  "432B" "4B" 
  

данные

 str1 <- "12A432B4B"
  

Комментарии:

1. Черт! Я все еще не понимаю, почему это работает — что-то вроде «разделить на A-Z и 0-9, но не использовать их»?

2. @user3375672 Проверяет границу между буквой (в верхнем регистре) и цифрой

Ответ №2:

Шаблон, упомянутый в сообщении, может использоваться так, как он есть в str_extract_all :

 str_extract_all(string, '[[:digit:]] [A-Z]')[[1]]
#[1] "12A"  "432B" "4B"  
  

Или в базе R :

 regmatches(string, gregexpr('[[:digit:]] [A-Z]', string))[[1]]
  

где string находится :

 string <- '12A432B4B'