#r #regex #gsub
#r #регулярное выражение #gsub
Вопрос:
Мой образец данных:
c("2tNO PEMJNUMt 2tALTOGETHER HOW MANY JOBSt216 - 217",
"1tREFERENCE PERSON 2tSPOUSE 3tCHILD 4tOTHER RELATIVE (PRIMARY FAMILY amp; UNREL) PRFAMTYPt2tFAMILY TYPE RECODEt155 - 156",
"5tUNABLE TO WORK PUBUS1t 2tLAST WEEK DID YOU DO ANYt184 - 185",
"2tNO PEIO1COWt 2tINDIVIDUAL CLASS OF WORKER CODEt432 - 433"
Для каждой строки я ищу извлечение (это имена переменных):
Строка 1: «PEMJNUM» Строка 2: «PRFAMTYP» Строка 3: «PUBUS1» Строка 4: «PEIO1COW»
Моей первоначальной целью было удалить символы gsub слева и справа от каждого имени переменной, чтобы оставить только имена переменных, но я смог захватить только все справа от имени переменной, и у меня возникли проблемы с захватом символов слева. (как показано здесь https://regexr.com/67r6j ).
Не уверен, что есть лучший способ сделать это!
Комментарии:
1. Ваш тест регулярных выражений недействителен, поскольку вы тестировали строковые литералы, а не литеральные строки.
Ответ №1:
Вы можете использовать sub
следующим образом:
x <- c("2tNO PEMJNUMt 2tALTOGETHER HOW MANY JOBSt216 - 217",
"1tREFERENCE PERSON 2tSPOUSE 3tCHILD 4tOTHER RELATIVE (PRIMARY FAMILY amp; UNREL) PRFAMTYPt2tFAMILY TYPE RECODEt155 - 156",
"5tUNABLE TO WORK PUBUS1t 2tLAST WEEK DID YOU DO ANYt184 - 185",
"2tNO PEIO1COWt 2tINDIVIDUAL CLASS OF WORKER CODEt432 - 433")
sub("^(?:.*\b)?(\w )\s*\b2\b.*", "\1", x, perl=TRUE)
# => [1] "PEMJNUM" "PRFAMTYP" "PUBUS1" "PEIO1COW"
Посмотрите онлайн-демонстрацию регулярных выражений и демонстрацию R.
Подробные сведения:
^
— начало строки(?:.*b)?
— необязательная группа без захвата, которая соответствует любому нулю или более символов (кроме символов разрыва строки, поскольку я используюperl=TRUE
, если вам также нужно сопоставить разрывы строк, добавьте(?s)
в начале шаблона) как можно больше, а затем положение границы слова(w )
— Группа 1 (1
): один или несколько символов words*
— ноль или более пробеловb
— граница слова2
—2
цифраb
— граница слова.*
— остальная часть строки / строки.
Если перед этим всегда есть пробелы 2
, регулярное выражение может быть записано как "^(?:.*\b)?(\w )\s 2\b.*"
.