我的示例数据是:
c("2tNO PEMJNUMt 2tALTOGETHER HOW MANY JOBSt216 - 217",
"1tREFERENCE PERSON 2tSPOUSE 3tCHILD 4tOTHER RELATIVE (PRIMARY FAMILY & UNREL) PRFAMTYPt2tFAMILY TYPE RECODEt155 - 156",
"5tUNABLE TO WORK PUBUS1t 2tLAST WEEK DID YOU DO ANYt184 - 185",
"2tNO PEIO1COWt 2tINDIVIDUAL CLASS OF WORKER CODEt432 - 433"
对于每一行,我希望提取(它们是变量名):
第一行:"第2行:"PRFAMTYP"第三行:pubus1;第4行:"PEIO1COW">
我最初的目标是删除每个变量名左右的字符,只留下变量名,但是我只能抓取变量名右边的所有内容,并且在抓取左边的字符时存在问题。(如https://regexr.com/67r6j所示)。
不确定是否有更好的方法来做到这一点!
您可以通过以下方式使用sub
:
x <- c("2tNO PEMJNUMt 2tALTOGETHER HOW MANY JOBSt216 - 217",
"1tREFERENCE PERSON 2tSPOUSE 3tCHILD 4tOTHER RELATIVE (PRIMARY FAMILY & 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
):一个或多个字字符s*
-零或多个空白b
- a字边界2
-2
位b
- a字边界.*
-剩下的行/字符串。
如果2
前面总是有空格,则正则表达式可以写成"^(?:.*\b)?(\w+)\s+2\b.*"
。