【问题标题】:R/stringr: Regex to acquire specific symbol within a specific part of a stringR/stringr:正则表达式获取字符串特定部分中的特定符号
【发布时间】:2019-08-11 08:30:56
【问题描述】:

我有几个字符串,如下所示:

> TstStr <- c("Carnivora, Caniformia, Canidae (dog, coyote, wolf, fox), Canis, Canis lupus (Gray wolf), Canis lupus familiaris (Dog) (Canis familiaris)")
> TstStr
[1] "Carnivora, Caniformia, Canidae (dog, coyote, wolf, fox), Canis, Canis lupus (Gray wolf), Canis lupus familiaris (Dog) (Canis familiaris)"

如果括号内的逗号和空格同时出现,我想用美元符号替换它们,最好使用stringr:str_replace_all(或类似的东西)。所以我希望输出看起来像这样:

> TstStr
[1] "Carnivora, Caniformia, Canidae (dog$coyote$wolf$fox), Canis, Canis lupus (Gray wolf), Canis lupus familiaris (Dog) (Canis familiaris)"

我不知道这种情况下的正则表达式应该是什么样子,因为我对正则表达式的了解是初级的。我试过str_match_all(Tstr, "(?&lt;=\\()(?:[:alpha:]*)\\,\\s(?:[:alpha:]*)(?=\\))") 但这不起作用(显然)。任何指针将不胜感激。

【问题讨论】:

  • @NelsonGon 逗号必须替换为美元符号。
  • @NelsonGon 抱歉措辞不好,我会改正的。编辑:我看到它已被修复。谢谢!

标签: r regex tidyr stringr


【解决方案1】:

你可以使用

library(stringr)
TstStr <- c("Carnivora, Caniformia, Canidae (dog, coyote, wolf, fox), Canis, Canis lupus (Gray wolf), Canis lupus familiaris (Dog) (Canis familiaris)")
str_replace_all(TstStr, "\\([^()]*\\)", function(x) { gsub("\\s*,\\s*", "$", x) })
[1] "Carnivora, Caniformia, Canidae (dog$coyote$wolf$fox), Canis, Canis lupus (Gray wolf), Canis lupus familiaris (Dog) (Canis familiaris)"

\\([^()]*\\) 模式将匹配内部不带括号的 (...) 子字符串,而带有 "\\s*,\\s*" 模式的 gsub 将在匹配项中用 $ 字符替换用 0+ 空格字符括起来的逗号。

正则表达式细节

  • \( - 一个 ( 字符
  • [^()]* - 除了 () 之外还有 0 个或多个字符
  • \) - ) 字符。

与此模式匹配的字符串被传递给作为str_replace_all 的第三个参数的匿名函数,然后gsub 替换所有情况

  • \s* - 0 个或多个空格
  • , - 逗号
  • \s* - 0 个或多个空格

在整个匹配中带有 $ 符号,并且修改后的匹配被返回并用作与 str_extract_all 找到的正则表达式匹配的替换。

【讨论】:

  • 谢谢!你能解释一下这是如何工作的吗?我有兴趣学习如何使用正则表达式(如果不超过)解决这个特定问题。
  • str_replace_all(Tstr, "\\([A-Za-z\\s\\,]*\\)", function(x){str_replace_all(x, "\\,\\s", "$")}) 似乎也有效。这是我试图实现的原始解决方案,但直到我看到你使用gsub 之前我不知道如何去做。非常感谢!
  • 您也可以使用regexone.com的互动教程
猜你喜欢
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2023-03-26
  • 2022-01-17
相关资源
最近更新 更多