извлечь n символов / цифр после точного шаблона - PullRequest
2 голосов
/ 03 апреля 2019

У меня есть следующая строка: 123-4567-C-4321-DD.xxxx

Я хотел бы извлечь только четыре цифры "4321" после "C-".Обратите внимание, что буквой «C» также может быть буква «P», она может быть прописной или строчной.

Я пробовал много предложений, которые выглядели так, как будто это может работать, но безрезультатно.Это казалось близким, но на самом деле захватывает первые четыре числа, которые он находит:

[^c|C,p|P-]{4}

ожидаемый = 4321, фактический = 4567

Ответы [ 6 ]

3 голосов
/ 03 апреля 2019

Это будет работать.

(?<=[(C|c|P|p)]-)([0-9]){4}
1 голос
/ 03 апреля 2019

Вы можете использовать str_match и использовать (?i), чтобы получить регистр без учета регистра и захватить 4 цифры в группе 1:

(?i)-[CP]-([0-9]{4})

R demo | Regex demo

Например:

library(stringr)
text = "123-4567-C-4321-DD.xxxx"
pattern = "(?i)-[CP]-([0-9]{})"
print(str_match(text, pattern)[,2])

Результат

[1] "4321"

Или использовать положительный вид сзади:

pattern = "(?i)(?<=-[CP]-)[0-9]{4}"
print(str_match(text, pattern)[,1])

Примечание

В классе символов труба | не означает или является литералом канала.

Если вы начинаете символкласс с ^ отрицает то, что ему разрешено совпадать, поэтому ваш шаблон [^c|C,p|P-]{4} соответствует 4 раза, а не c, C, P, p, |, ,или -

0 голосов
/ 03 апреля 2019

Вот подход без регулярных выражений,

sapply(strsplit(s, '-', fixed = TRUE), function(i)i[which(i %in% c('C', 'c', 'p', 'P')) + 1])
#[1] "4321" "4321" "4321" "4321"

ДАННЫЕ (взято из @jay.sf)

s <- c("123-4567-C-4321-DD.xxxxA", "123-4567-P-4321-DD.xxxxA", 
       "123-4567-c-4321-DD.xxxxA", "123-4567-p-4321-DD.xxxxA")
0 голосов
/ 03 апреля 2019

Я использовал функцию str_match в пакете stringr.

pattern = "-[c|C|p|P]-(\\d{4})"
str_match(text, pattern)

В скобках есть группа.

Таким образом, вы можете экспортировать цифры, которые хотите получить, используя группу.

Результат кода

0 голосов
/ 03 апреля 2019

Если он находится в фиксированном положении, вы можете считать назад (и вперед) с помощью stringr::str_sub() или только вперед с базой R substr().

stringr::str_sub(s, -13, -10)

База R:

substr(s, 12, 15)

Вывод:

[1] "4321" "4321" "4321" "4321"

Использование набора данных @ jay.sf:

s <- c("123-4567-C-4321-DD.xxxxA", "123-4567-P-4321-DD.xxxxA", 
       "123-4567-c-4321-DD.xxxxA", "123-4567-p-4321-DD.xxxxA")
0 голосов
/ 03 апреля 2019

Вы можете попробовать это.

gsub("(.*)([cCpP]-)(\\d{4}).*", "\\3", s, perl=TRUE)
# [1] "4321" "4321" "4321" "4321"

Данные

s <- c("123-4567-C-4321-DD.xxxxA", "123-4567-P-4321-DD.xxxxA", 
       "123-4567-c-4321-DD.xxxxA", "123-4567-p-4321-DD.xxxxA")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...