使用正则表达式提取字符串 - str_extract, stringr, regex
string extraction with regular expressions - str_extract, stringr, regex
我正在努力解决字符串提取问题 - 请参见下面的示例。如果您能帮助我,我将不胜感激!
注意:很抱歉我在这里缺乏正则表达式知识
Objective: 我试图在文本中提取从参考向量到目标向量的匹配项,并在 table 从参考文本分配文本。
目标数据框示例、搜索文本和目前尝试的方法:
a <- c(1, 2, 3, 4, 5, 6, 7)
b <- c('TC2', 'TC25', 'TC255', 'Tops', 'TC2_', 'TC2 ', 'TC2555')
df <- data.frame(a, b)
search_text <- c('TC2', 'TC255')
search_string <- paste(paste0(search_text, '[regexp]'), sep = "", collapse = "|")
df %>%
mutate(match = str_extract(b, search_string))
[regexp] 表示我试图让这个方法起作用的各种事情....它包括各种 'hair-brained ideas' 像 '\\d?' 等等(更多这个和类似的组合比我想记住的要多)。正如你想象的那样没有用。
期望输出:
最终我想达到这个....
a <- c(1, 2, 3, 4, 5, 6, 7)
b <- c('TC2', 'TC25', 'TC255', 'Tops', 'TC2_', 'TC2 ', 'TC2555')
match <- c('TC2', NA_character_, 'TC255', NA_character_, 'TC2', 'TC2', NA_character_)
df_desired <- data.frame(a, b, match)
非常感谢您的帮助
search_string <- paste0("(", paste(search_text, collapse = "|"), ")(?![A-Za-z0-9])")
search_string
# [1] "(TC2|TC255)(?![A-Za-z0-9])"
df_desired %>%
mutate(match2 = str_extract(b, search_string))
# a b match match2
# 1 1 TC2 TC2 TC2
# 2 2 TC25 <NA> <NA>
# 3 3 TC255 TC255 TC255
# 4 4 Tops <NA> <NA>
# 5 5 TC2_ TC2 TC2
# 6 6 TC2 TC2 TC2
# 7 7 TC2555 <NA> <NA>
这是使用 negative lookahead,它尝试匹配但不在提取的文本中包含该前瞻匹配。
(我最初想使用 \b
作为单词边界,但 _
不适合。)
我正在努力解决字符串提取问题 - 请参见下面的示例。如果您能帮助我,我将不胜感激!
注意:很抱歉我在这里缺乏正则表达式知识
Objective: 我试图在文本中提取从参考向量到目标向量的匹配项,并在 table 从参考文本分配文本。
目标数据框示例、搜索文本和目前尝试的方法:
a <- c(1, 2, 3, 4, 5, 6, 7)
b <- c('TC2', 'TC25', 'TC255', 'Tops', 'TC2_', 'TC2 ', 'TC2555')
df <- data.frame(a, b)
search_text <- c('TC2', 'TC255')
search_string <- paste(paste0(search_text, '[regexp]'), sep = "", collapse = "|")
df %>%
mutate(match = str_extract(b, search_string))
[regexp] 表示我试图让这个方法起作用的各种事情....它包括各种 'hair-brained ideas' 像 '\\d?' 等等(更多这个和类似的组合比我想记住的要多)。正如你想象的那样没有用。
期望输出:
最终我想达到这个....
a <- c(1, 2, 3, 4, 5, 6, 7)
b <- c('TC2', 'TC25', 'TC255', 'Tops', 'TC2_', 'TC2 ', 'TC2555')
match <- c('TC2', NA_character_, 'TC255', NA_character_, 'TC2', 'TC2', NA_character_)
df_desired <- data.frame(a, b, match)
非常感谢您的帮助
search_string <- paste0("(", paste(search_text, collapse = "|"), ")(?![A-Za-z0-9])")
search_string
# [1] "(TC2|TC255)(?![A-Za-z0-9])"
df_desired %>%
mutate(match2 = str_extract(b, search_string))
# a b match match2
# 1 1 TC2 TC2 TC2
# 2 2 TC25 <NA> <NA>
# 3 3 TC255 TC255 TC255
# 4 4 Tops <NA> <NA>
# 5 5 TC2_ TC2 TC2
# 6 6 TC2 TC2 TC2
# 7 7 TC2555 <NA> <NA>
这是使用 negative lookahead,它尝试匹配但不在提取的文本中包含该前瞻匹配。
(我最初想使用 \b
作为单词边界,但 _
不适合。)