извлекающая строка gsub

#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 ): один или несколько символов word
  • s* — ноль или более пробелов
  • b — граница слова
  • 2 2 цифра
  • b — граница слова
  • .* — остальная часть строки / строки.

Если перед этим всегда есть пробелы 2 , регулярное выражение может быть записано как "^(?:.*\b)?(\w )\s 2\b.*" .