Разбить строку на разделитель используя stringr :: str_replace - PullRequest
1 голос
/ 09 июля 2019

Мне нужна помощь в отношении регулярного выражения, которое выделяет третий элемент, разделенный подчеркиванием.Количество подчеркиваний является переменным.Я могу сделать это с помощью str_split, но есть ли способ получить тот же результат, что и ниже, используя str_replace?(Желаемый результат - x = AAAA, BBBB, CCCC, DDDD. Если возможно, поддержание группировки с использованием ().)

library(tidyverse)
library(stringr)

d <- enframe(c("asfe_01_AAAA_fses_feee",
               "asfe_87_BBBB_fses_feee",
               "99_fesf_CCCC_feee",
               "99_fesf_DDDD"),
             name = NULL, value = "txt")

d %>%
  mutate(x = str_replace(txt, "(.+)_(.+)_(.+)_*(.*)_*(.*)", "\\3"),
         want_strsplit = str_split(txt, "_", simplify = TRUE)[, 3])

#txt                    x     want_strsplit
#  <chr>                  <chr> <chr>        
#1 asfe_01_AAAA_fses_feee feee  AAAA         
#2 asfe_87_BBBB_fses_feee feee  BBBB         
#3 99_fesf_CCCC_feee      feee  CCCC         
#4 99_fesf_DDDD           DDDD  DDDD    

Ответы [ 4 ]

5 голосов
/ 09 июля 2019

Вы можете просто использовать strsplit немного больше.

mapply(`[`, strsplit(d$txt, "_"), 3)
# [1] "AAAA" "BBBB" "CCCC" "DDDD"

Для всего этого:

splt <- strsplit(d$txt, "_")
cbind(d, x=mapply(`[`, splt, lengths(splt)), want_strsplit=mapply(`[`, splt, 3))
#                      txt    x want_strsplit
# 1 asfe_01_AAAA_fses_feee feee          AAAA
# 2 asfe_87_BBBB_fses_feee feee          BBBB
# 3      99_fesf_CCCC_feee feee          CCCC
# 4           99_fesf_DDDD DDDD          DDDD
3 голосов
/ 09 июля 2019

Опция с sub

sub("^(([^_]+_){2})([^_]+).*", "\\3", d$txt)
#[1] "AAAA" "BBBB" "CCCC" "DDDD"
3 голосов
/ 09 июля 2019

С str_replace

> d%>%mutate(x=str_replace(txt,"^((?:[^_]*_){2})([a-zA-Z]+).*","\\2"))
# A tibble: 4 x 2
  txt                    x    
  <chr>                  <chr>
1 asfe_01_AAAA_fses_feee AAAA 
2 asfe_87_BBBB_fses_feee BBBB 
3 99_fesf_CCCC_feee      CCCC 
4 99_fesf_DDDD           DDDD 

Первая группа фиксирует первые два вхождения _.Вторая группа захватывает любой текст после последней группы.
Если у вас также могут быть числа, вы можете обобщить их с помощью [[:alnum:]]

d%>%mutate(x=str_replace(txt,"^((?:[^_]*_){2})([[:alnum:]]+).*","\\2"))
1 голос
/ 09 июля 2019
d %>%
  mutate(x = str_replace(txt, "^([^_]+)_([^_]+)_([^_]+).*", "\\3"))
  • [^_] означает все, кроме _
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...