str_extract在R中匹配字母和数字组合的代码
str_extract in R to match a code combined of letters and numbers
我正在尝试使用 R 中的 str_extract 函数从 R 中的文本字符串中提取 "ATC code"。
字符串中的代码始终以 "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
假设我们使用 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
或者我们可以使用 library(tidyr)
中的 extract
。我们捕获(在括号内)跟在 ATC:
后跟一个或多个 space (\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"
我正在尝试使用 R 中的 str_extract 函数从 R 中的文本字符串中提取 "ATC code"。
字符串中的代码始终以 "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
假设我们使用 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
或者我们可以使用 library(tidyr)
中的 extract
。我们捕获(在括号内)跟在 ATC:
后跟一个或多个 space (\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"