如何提取R中括号内的文本?

时间:2019-02-23 11:45:50

标签: r regex

如何提取包含名称和年份的所有括号?

#assumed data is tuple
>>>unpack(len(data)*h,data)

所需的输出如下所示:

select mdate, mentry, mexit,
       (max(case when seqnum = 1 then total else 0 end) over (order by mdate) +
        sum(case when seqnum > 1 then mentry - mexit else 0 end) over (order by mdate)
       ) as new_total
from (select d.*, row_number() over (order by mdate) as seqnum
      from dash d
     ) d

我不想提取(2018)和(antonio)

2 个答案:

答案 0 :(得分:5)

您可以将str_extract_all包中的stringr与此正则表达式一起使用:

stringr::str_extract_all(string, 
                         "\\(\\w+([[:punct:]]{1}|[[:blank:]]{1})[[:digit:]]+\\)")

# [[1]]
# [1] "(antonio.2018)"  "(giovanni,2018)" "(libero 2019)"  

正则表达式的简短描述:

\\w将匹配任何单词字符
+意味着必须至少匹配一次
[[:punct:]]将匹配任何标点符号
{1}只会出现一次
(....|....)表示一种模式,或者必须满足另一种模式
[[:blank:]]表示必须出现空格
[[:digit:]]表示必须出现任何数字
\\(括号必须退出。

答案 1 :(得分:3)

@loki的答案很棒!您也可以尝试一下,希望对您有用:)

x<-regmatches(string, gregexpr("(?=\\().*?(?<=\\))", string, perl=T))[[1]]

>x

[1] "(antonio.2018)"  "(antonio)"       "(giovanni,2018)" "(2018)"          "(libero 2019)"  

#Extract every nth value. 
>x[seq_along(x) %% 2 > 0]
[1] "(antonio.2018)"  "(giovanni,2018)" "(libero 2019)"  

注意:不确定完整的数据集(即结构是否始终为第n个格式。如果为(每个第2个值),则可以大规模使用。