使用正则表达式提取字符串 - str_extract、stringr、regex

Posted

技术标签:

【中文标题】使用正则表达式提取字符串 - str_extract、stringr、regex【英文标题】:string extraction with regular expressions - str_extract, stringr, regex 【发布时间】:2022-01-18 21:41:05 【问题描述】:

我正在努力解决字符串提取问题 - 请参阅下面的示例。如果您能帮助我,我将不胜感激!

注意:抱歉我在这里缺乏正则表达式知识

目标:我正在尝试从参考向量到目标向量之间的文本中提取匹配项,并在表中创建一个新变量,从参考文本中分配文本。 p>

目前为止的目标数据框、搜索文本和尝试的方法示例:

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] 表示我试图让这种方法发挥作用的各种事情......它包括各种“头脑发热的想法”,如“\\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)

非常感谢您的帮助

【问题讨论】:

你的意思是df_desired &lt;- data.frame(a, b, match) 对不起,是的。我会编辑 【参考方案1】:
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 作为单词边界,但_ 不适合。)

【讨论】:

对不起,我应该在这里提一下,search_text 旨在作为调用包装函数的参数的输入,因此可以是 PT255 或 CT34B。我最初尝试使用一个非常简化的版本来磨练答案,但我应该提到道歉 我想我最终得到了支持,我知道您正在寻找更通用的解决方案。我假设您的接受意味着我的编辑足够笼统并且有效,对吗? 在真实的东西上也很完美。非常感谢。我开始觉得我应该早点问你在不到 4 分钟的时间内解决了这个问题:) 再次感谢 努力一点有助于学习过程......至少有人告诉我 ;-)

以上是关于使用正则表达式提取字符串 - str_extract、stringr、regex的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式提取部分字符串

如何使用 JavaScript 正则表达式提取字符串?

无法使用正则表达式在双引号之间提取字符串

外壳脚本。如何使用正则表达式提取字符串

python正则表达式提取字符串

用python正则表达式提取字符串