Как поместить | символ, чтобы соответствовать одному из двух регулярных выражений шаблонов с использованием stringr :: str_match?

голоса
1

Различные форматы найдены в df$PlateNameявляются:

    MIPS_AGRE_P01_DIL
    MIPS_SSC_P50_DIL
    MIPS_MtS_P34
    MIPS_AT_P1_DIL
    KORgex.mips.G12
    MIPS_SSC_CL_P32_DIL
    MIPS_SSC_CL_Low_DIL

Используя это регулярное выражение, которое очень неуклюжим, возвращает следующие типы:

str_match(df$PlateName, 
          MIPS_([:alnum:]+(?:_[:alnum:]+)?)_[Low|P:digit:]+(?:_[DIL])?|(KORgex).*)) %>%
  as.tibble %>% 
  count(V2)

Все те NA являются KORgex.mips.G12типами. Как я могу сделать это регулярное выражение работы?

AGRE    1654            
AT      93          
MtS     1324            
SSC     5280            
SSC_CL  288         
NA      529 

ОБНОВИТЬ:

Я понял , что это, вероятно , лучше использовать str_extractв этом случае, как будет возвращать только совпадающую часть каждого компонента df$PlateName.

Я до сих пор не вполне может получить код, чтобы вернуть то, что мне нужно - что мне не хватает?

str_extract(data$PlateName, [[:alnum:]+^(?!(MIPS))]_([[:alnum:]&&[^P]]+(_CL)?)?|(KORgex)) %>% 
as.tibble  %>% 
count(value)`

возвращает:

KORgex      529         
S_AGRE      1654            
S_AT        93          
S_MtS       1324            
S_SSC       5280            
S_SSC_CL    288 

Я не могу за жизнь мне избавиться от S_в MIPS_подтипах!

Задан 20/04/2018 в 01:17
источник пользователем
На других языках...                            


3 ответов

голоса
2

Самое лучшее , что мы могли бы сделать здесь , используя филиальную группу сброса , (?|...|...)чтобы получить только одну группу вместо нескольких из них.

Тем не менее, stringr/ stringiфункция в R являются основаниями на СИС регулярных выражений аромата , который не поддерживает сброс групп ветвления.

Самый удобный способ использования сброса филиальную здесь через grep:

grep(df$PlateName, 
  "(?|MIPS_([:alnum:]+(?:_[:alnum:]+)?)_[Low|P:digit:]+(?:_[DIL])?|(KORgex).*)", perl=TRUE)
Ответил 20/04/2018 в 04:28
источник пользователем

голоса
2

Я думаю , что это должно работать. После возни с str_matchна некоторое время, я решил , что это было просто легче использовать , str_replaceчтобы удалить все , что вы не хотите.

df$PlateName %>%
  str_replace("([[:alpha:]]+_)?([[:alpha:]]+)(_CL)?(_|\\.)??.*", "\\2\\3") %>%
  as_tibble() %>%
  count(value)
Ответил 20/04/2018 в 04:48
источник пользователем

голоса
2

Надеюсь это поможет!

library(stringr)
library(dplyr)

#this step places "|" symbol to match either of two regex patterns
str_match(df$PlateName, "MIPS_(\\S+)_[P|Low].*|(KORgex).*") %>%
  #convert to dataframe to count its occurrences
  data.frame(stringsAsFactors=F) %>%
  mutate(sub_PlateName = coalesce(X2, X3)) %>%
  group_by(sub_PlateName) %>%
  tally()

Выход:

  sub_PlateName     n
1 AGRE              1
2 AT                1
3 KORgex            1
4 MtS               1
5 SSC               1
6 SSC_CL            2

Пример данных:

df <- structure(list(PlateName = c("MIPS_AGRE_P01_DIL", "MIPS_SSC_P50_DIL", 
"MIPS_MtS_P34", "MIPS_AT_P1_DIL", "KORgex.mips.G12", "MIPS_SSC_CL_P32_DIL", 
"MIPS_SSC_CL_Low_DIL")), .Names = "PlateName", class = "data.frame", row.names = c(NA, 
-7L))


Обновление: Использованиеstr_extract

str_extract(df$PlateName, "(?<=MIPS_)\\S+(?=_P|_Low)|KORgex") %>% 
  as.tibble %>% 
  count(value)
#   value     n
#1   AGRE     1
#2     AT     1
#3 KORgex     1
#4    MtS     1
#5    SSC     1
#6 SSC_CL     2
Ответил 20/04/2018 в 07:03
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more