Любой шаблон такой же длины, который не является желаемым - PullRequest
0 голосов
/ 01 февраля 2019

Используя Adobe Acrobat Pro для преобразования таблицы PDF в Excel, которая затем читалась в R, я исправляю все элементы столбца (скажем, ID), чтобы они соответствовали тому, что было изначально в PDF, потому что преобразование создало некоторые проблемы.(то есть 5 стало S, 8 стало B или S, 0 O и D поменялись местами, 6 стало 0, я стал 1, были добавлены пробелы и т. д.) До сих пор я использовал регулярное выражение, чтобы исправить все элементы, а некоторые не могутисправить, кроме как вручную, и заново создать лист Excel с исправлениями.Это ежемесячный проект, и в будущем могут возникнуть ошибки.Я хочу создать регулярное выражение, чтобы найти что-то, что все еще не соответствует желаемому шаблону, и добавить маркер (то есть%, или?, Или!)

Требуемый шаблон следует шаблону XYY, где X - [AT] и Y равны [0-2] и [0-9] соответственно.Самый низкий уровень А01, самый высокий уровень Т25.Я хочу найти все, что находится за пределами этого «диапазона» или все еще неверно, и добавить маркер.До сих пор я пытался сделать следующее.Я не могу предоставить данные в целях конфиденциальности.

Вот пример, который должен донести смысл.

mydf <- data.frame(ID = c("A01", "J31", "K24", "L12", "T26", "810"))
mydf$ID <- gsub("(^[^A-T][02][0-9])", "\\1!", mydf$ID)

но это ничего не дает.Я также попытался использовать это:

!grepl("^[A-T][0-2][0-9]$", mydf$ID)

Тогда я мог бы отметить все идентификаторы, которые являются неправильными.Он обнаруживает, что J31 и 810 неверны, но пропускает T26 как неправильный идентификатор.

Можно предположить, что все идентификаторы будут одинаковой длины, 3 символа.Требуется код R.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Я думаю, что просто наивно разбив его на 3 возможных случая, сработает.Что-то вроде:

mydf <- data.frame(ID = c("A01", "J31", "K24", "L12", "T26", "810"))
mydf$ID <- gsub("((?:[^A-T].{2})|(?:[A-T][3-9].)|(?:[A-T]2[6-9]))", "\\1!", mydf$ID)

Обратите внимание, что это предполагает, что есть ровно 3 цифры.

0 голосов
/ 01 февраля 2019

Вот один из способов сделать это с отрицательными взглядами, который требует perl = TRUE в gsub.По сути, я изменяю ваш шаблон на положительное совпадение (нужно начать, затем AT, затем 0-1 и 0-9, или 2 и 0-5, затем символ конца) и добавляю ?!, чтобы указать, что не ищите этого,Обратите внимание, что вы пропустили дефис выше.Однако, отрицательное регулярное выражение не всегда очень ясно, и это может быть легче понять, если вы просто используете stringr::str_detect или grepl с положительным соответствием, а затем отрицаете результирующий логический вектор для использования в качестве столбца индикатора.

mydf <- data.frame(ID = c("A01", "J31", "K24", "L12", "T26", "810", "A012", "AA12"))
mydf$ID <- gsub("(^(?!^([A-T][0-1][0-9]|[A-T]2[0-5])$).*)", "\\1!", mydf$ID, perl = TRUE)
mydf$ID
#> [1] "A01"   "J31!"  "K24"   "L12"   "T26!"  "810!"  "A012!" "AA12!"

Создано в 2019-01-31 пакетом Представ (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...