在R中解析具有某些要求的字符串的最后部分

时间:2015-04-17 18:10:22

标签: regex r

我想在字符串的最后部分对数据框进行子集化但是我的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

2 个答案:

答案 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}$"