我是R的新手,我想了解R中的正则表达式。因此,我有datatable(df)的列(FileName2),其中的字符串具有不同的模式,并且我必须了解字符串,并给它一个名称,例如标识符,以便标识符可以识别相同的模式。标识符的名称必须在同一数据表的另一列中。我有以下3种不同的模式: 1.字符串名称:Modifc10或可以是modifc1:前五个字符是固定的,下一个是固定的字母,下一个可以是一个或两个数字。让我们以此作为标识符1。 2.字符串名称:modifcwi12或modifcfl1:前五个字符固定,后三个字母固定,下一个可以是一或两个数字。以其为标识符2。 3.String名称:MODIFSW:前五个字符是固定的,后三个或两个是字母,而不是数字。请以该字符作为标识符三。
i/p:
FileName2
MODIFC1
MODIFC10
MODIFC2
modifcfl1
MODIFCS
modifcWA1
modifcWI10
modifcWI7
MODIFS7
modifsfl1
modifsWI1
modifsWI10
modifsWI2
我想用正则表达式来做到这一点。我正在尝试这样做>>
df1 <- df[FileName2 %like% '(?i)modif\\w\\d',Identifier := 'One']
df2 <- df1[FileName2 %like% '(?i)modif\\w\\w\\w\\d',Identifier := 'Two']
df3 <- df2[FileName2 %like% '(?i)modif\\w',Identifier := 'Third']
但是,它没有给出准确的结果。我很确定,我没有使用正确的正则表达式或正确的方法来执行此操作。请让我知道执行此操作的有效方法。
O / p应该像:
FileName2 Identifier
MODIFC1 One
MODIFC10 One
MODIFC2 One
modifcfl1 Two
MODIFCS Three
modifcWA1 Two
modifcWI10 Two
modifcWI7 Two
MODIFS7 One
modifsfl1 Two
modifsWI1 Two
modifsWI10 Two
modifsWI2 Two
答案 0 :(得分:0)
请注意,根据您的预期输出,规则3中存在错误; bool Student::operator < (const Student b)
{
return year < b.year ? true : false;
}
的前5个字符固定不变,后面仅2个字符(而不是您的规则中的3个字符)。
我假设对于规则3,MODIFCS
/ "modif"
后面可以有2个或 3个字符。
我们可以将"MODIF"
与dplyr::case_when
一起使用
stringr::str_detect
library(tidyverse)
df %>%
mutate(Identifier = case_when(
str_detect(tolower(Filename2),"^modif[a-z]\\d{1,2}$") ~ "One",
str_detect(tolower(Filename2),"^modif[a-z]{3}\\d{1,2}$") ~ "Two",
str_detect(tolower(Filename2),"^modif[a-z]{2,3}$") ~ "Three"
))
# Filename2 Identifier
#1 MODIFC1 One
#2 MODIFC10 One
#3 MODIFC2 One
#4 modifcfl1 Two
#5 MODIFCS Three
#6 modifcWA1 Two
#7 modifcWI10 Two
#8 modifcWI7 Two
#9 MODIFS7 One
#10 modifsfl1 Two
#11 modifsWI1 Two
#12 modifsWI10 Two
#13 modifsWI2 Two