#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'