我想在字符串的最后部分对数据框进行子集化但是我的R中的正则表达式技能缺乏。这是我遇到的问题。我有一个看起来像这样的专栏:
EM1234 > COMJ1234 > ADW1234
ADW1234 > COMJ1234 > EM1234
EM4321 > COMJ1234 > EM1234
COMJEM > ADW1234 > MSNK123
COMJ12 > ADW1234 > EMP1234
我只想将ENDS与EM而不是EMP的数据子集化。我也遇到了第一个COMJEM的最后一个问题。因为对任何字符使用正则表达式都会包含该示例。这是我目前正在使用但不起作用的地方:
sources <- data.frame(column = I(c('EM1234 > COMJ1234 > ADW1234',
'ADW1234 > COMJ1234 > EM1234',
'EM4321 > COMJ1234 > EM1234',
'COMJEM > ADW1234 > MSNK123',
'COMJ12 > ADW1234 > EMP1234')))
subset <- sources[grep("^'.+EM[[:alnum:]]{2,8}'$", sources$column),]
编写此正则表达式的更好方法是什么?答案应该导致子集看起来像这样:
ADW1234 > COMJ1234> EM1234
EM4321 > COMJ1234> EM1234
答案 0 :(得分:1)
您可以使用字边界\b
并在字符串末尾匹配:
sources[grep('\\bEM[^P]\\S+$', sources$column),]
# [1] "ADW1234 > COMJ1234 > EM1234" "EM4321 > COMJ1234 > EM1234"
答案 1 :(得分:0)
您要使用\\d
或[:digit:]
,因为[:alnum:]
匹配所有字母数字字符(即[:alpha:]
和[:digit:]
)。另外我想你想在你的字符串中删除单引号,如:
"^.+EM\\d{2,8}$"
或
"^.+EM[[:digit:]]{2,8}$"