gsub 提取字符串
gsub extracting string
我的示例数据是:
c("2\tNO PEMJNUM\t 2\tALTOGETHER HOW MANY JOBS\t216 - 217",
"1\tREFERENCE PERSON 2\tSPOUSE 3\tCHILD 4\tOTHER RELATIVE (PRIMARY FAMILY & UNREL) PRFAMTYP\t2\tFAMILY TYPE RECODE\t155 - 156",
"5\tUNABLE TO WORK PUBUS1\t 2\tLAST WEEK DID YOU DO ANY\t184 - 185",
"2\tNO PEIO1COW\t 2\tINDIVIDUAL CLASS OF WORKER CODE\t432 - 433"
对于每一行,我要提取(它们是变量名):
第 1 行:“PEMJNUM”
第 2 行:“PRFAMTYP”
第 3 行:“PUBUS1”
第 4 行:“PEIO1COW”
我最初的目标是用 gsub 删除每个变量名左右的字符,只留下变量名,但我只能抓取变量名右侧的所有内容,抓取时遇到问题左边的字符。 (如此处所示https://regexr.com/67r6j)。
不确定是否有更好的方法!
您可以通过以下方式使用sub
:
x <- c("2\tNO PEMJNUM\t 2\tALTOGETHER HOW MANY JOBS\t216 - 217",
"1\tREFERENCE PERSON 2\tSPOUSE 3\tCHILD 4\tOTHER RELATIVE (PRIMARY FAMILY & UNREL) PRFAMTYP\t2\tFAMILY TYPE RECODE\t155 - 156",
"5\tUNABLE TO WORK PUBUS1\t 2\tLAST WEEK DID YOU DO ANY\t184 - 185",
"2\tNO PEIO1COW\t 2\tINDIVIDUAL CLASS OF WORKER CODE\t432 - 433")
sub("^(?:.*\b)?(\w+)\s*\b2\b.*", "\1", x, perl=TRUE)
# => [1] "PEMJNUM" "PRFAMTYP" "PUBUS1" "PEIO1COW"
参见online regex demo and the R demo。
详情:
^
- 字符串开头
(?:.*\b)?
- 一个可选的非捕获组,匹配任何零个或多个字符(除了换行字符,因为我使用 perl=TRUE
,如果您也需要匹配换行符,请添加(?s)
at the pattern start) as many as possible, 然后是单词边界位置
(\w+)
- 第 1 组 (</code>):一个或多个单词字符 </li>
<li><code>\s*
- 零个或多个空格
\b
- 单词边界
2
- 2
数字
\b
- 单词边界
.*
- line/string. 的其余部分
如果2
之前总是有空格,正则表达式可以写成"^(?:.*\b)?(\w+)\s+2\b.*"
.
我的示例数据是:
c("2\tNO PEMJNUM\t 2\tALTOGETHER HOW MANY JOBS\t216 - 217",
"1\tREFERENCE PERSON 2\tSPOUSE 3\tCHILD 4\tOTHER RELATIVE (PRIMARY FAMILY & UNREL) PRFAMTYP\t2\tFAMILY TYPE RECODE\t155 - 156",
"5\tUNABLE TO WORK PUBUS1\t 2\tLAST WEEK DID YOU DO ANY\t184 - 185",
"2\tNO PEIO1COW\t 2\tINDIVIDUAL CLASS OF WORKER CODE\t432 - 433"
对于每一行,我要提取(它们是变量名):
第 1 行:“PEMJNUM” 第 2 行:“PRFAMTYP” 第 3 行:“PUBUS1” 第 4 行:“PEIO1COW”
我最初的目标是用 gsub 删除每个变量名左右的字符,只留下变量名,但我只能抓取变量名右侧的所有内容,抓取时遇到问题左边的字符。 (如此处所示https://regexr.com/67r6j)。
不确定是否有更好的方法!
您可以通过以下方式使用sub
:
x <- c("2\tNO PEMJNUM\t 2\tALTOGETHER HOW MANY JOBS\t216 - 217",
"1\tREFERENCE PERSON 2\tSPOUSE 3\tCHILD 4\tOTHER RELATIVE (PRIMARY FAMILY & UNREL) PRFAMTYP\t2\tFAMILY TYPE RECODE\t155 - 156",
"5\tUNABLE TO WORK PUBUS1\t 2\tLAST WEEK DID YOU DO ANY\t184 - 185",
"2\tNO PEIO1COW\t 2\tINDIVIDUAL CLASS OF WORKER CODE\t432 - 433")
sub("^(?:.*\b)?(\w+)\s*\b2\b.*", "\1", x, perl=TRUE)
# => [1] "PEMJNUM" "PRFAMTYP" "PUBUS1" "PEIO1COW"
参见online regex demo and the R demo。
详情:
^
- 字符串开头(?:.*\b)?
- 一个可选的非捕获组,匹配任何零个或多个字符(除了换行字符,因为我使用perl=TRUE
,如果您也需要匹配换行符,请添加(?s)
at the pattern start) as many as possible, 然后是单词边界位置(\w+)
- 第 1 组 (</code>):一个或多个单词字符 </li> <li><code>\s*
- 零个或多个空格\b
- 单词边界2
-2
数字\b
- 单词边界.*
- line/string. 的其余部分
如果2
之前总是有空格,正则表达式可以写成"^(?:.*\b)?(\w+)\s+2\b.*"
.