R中的str_extract匹配字母和数字组合的代码

时间:2015-10-11 11:35:12

标签: r stringr

我正在尝试使用R中的str_extract函数从R中的文本字符串中提取“ATC代码”。

字符串中的代码始终以“ATC:”开头,然后代码本身就是字母和数字组合在一起的组合。

当前输出部分正常工作,我只是在努力匹配“A07AX”,好像我将数字设为可选,那么它显然匹配甚至低于要求

原始数据框:

library(dplyr)

data01 <-
  rbind(data.frame(text = "abc (ATC: A07BA51) fdfv"),
        data.frame(text = "abc (ATC: A07AX) dsaf"),
        data.frame(text = "abc (ATC: M01AE01) dff"))

                     text
1 abc (ATC: A07BA51) fdfv
2   abc (ATC: A07AX) dsaf
3  abc (ATC: M01AE01) dff

提取ATC组的代码:

library(stringr)

data02 <-
  data01 %>%
  mutate(atc_group = gsub("ATC:|\\s", "", str_extract(text, "ATC:\\s([A-Z]+\\d+)+"))) 

当前输出:

                     text atc_group
1 abc (ATC: A07BA51) fdfv   A07BA51
2   abc (ATC: A07AX) dsaf       A07
3  abc (ATC: M01AE01) dff   M01AE01

1 个答案:

答案 0 :(得分:1)

假设我们使用的是dplyr,我们会提取不是)且在正则表达式外观(?<=ATC:\\s)之后的字符。

library(dplyr)
library(stringr)
data01 %>% 
      mutate(atc_group=str_extract(text, '(?<=ATC:\\s)[^)]+'))
#                    text atc_group
#1 abc (ATC: A07BA51) fdfv   A07BA51
#2   abc (ATC: A07AX) dsaf     A07AX
#3  abc (ATC: M01AE01) dff   M01AE01

或者我们可以使用extract中的library(tidyr)。我们捕获(括号内)跟随ATC:后跟一个或多个空格(\\s+)的字母数字字符。

library(tidyr)
extract(data01, text, into='atc_group', 
         '.*\\(ATC:\\s+([[:alnum:]]+)\\).*', remove=FALSE)
#                     text atc_group
#1 abc (ATC: A07BA51) fdfv   A07BA51
#2   abc (ATC: A07AX) dsaf     A07AX
#3  abc (ATC: M01AE01) dff   M01AE01

我们也可以gsub提取子字符串

gsub('.*ATC:\\s+|\\).*', '', data01$text)
#[1] "A07BA51" "A07AX"   "M01AE01"