【问题标题】:Insert a character as an item delimiter into string in R将一个字符作为项目分隔符插入到R中的字符串中
【发布时间】:2021-11-04 12:00:38
【问题描述】:

在 R 中,我有一个包含多个条目的字符串,例如:

mydata <- c("(first data entry) (second data entry) (third data entry) ")

我想插入管道符号“|”条目之间作为项目分隔符,以以下列表结尾:

"(first data entry)|(second data entry)|(third data entry)"

并非所有 mydata 行都包含相同数量的条目。如果 mydata 包含 0 个或仅 1 个条目,则没有“|”管道符号是必需的。

我尝试了以下方法但没有成功:

newdata <- paste(mydata, collapse = "|")

感谢您的帮助!

【问题讨论】:

  • 试试gsub(") (", ")|(", mydata, fixed=TRUE)

标签: r regex


【解决方案1】:

这将用“|”替换空格在你的字符串中。如果您需要更复杂的规则,请使用带有 gsub 的正则表达式。

gsub(") (",")|(", yourString)

【讨论】:

【解决方案2】:

如果您有一致的)+1 空格+( 模式,则不需要正则表达式。

你可以简单地使用

gsub(") (", ")|(", mydata, fixed=TRUE)

如果您的字符串包含可变数量的空格、制表符等,您可以使用

gsub("\\)\\s*\\(", ")|(", mydata)
gsub("\\)[[:space:]]*\\(", ")|(", mydata)
stringr::str_replace_all(mydata, "\\)\\s*\\(", ")|(")

这里,\)\s*\( 模式匹配 )(因为 ) 是一个特殊的正则表达式元字符而被转义),然后是零个或多个空格,然后是 (

请参阅regex demo

如果括号之间总是有一个或多个空格,请使用\s+ 而不是\s*

【讨论】:

  • 所有四个解决方案都按预期工作 - proof
  • 我在这里使用环视获得了很大的优势 :) 每天我都会按照你的轨迹进行一次正则表达式练习,然后再做其他任务,希望 50 年后我会变得和你一样好。谢谢你的启发:)
【解决方案3】:

我认为您也可以使用以下解决方案:

gsub("(?<=\\))\\s+(?=\\()", "|", mydata, perl = TRUE)

[1] "(first data entry)|(second data entry)|(third data entry) "

【讨论】:

  • 是的,它会起作用的。但是,请注意,未锚定的环视会阻止内部优化,必须检查每个位置。我宁愿在这样的简单情况下使用消费对应物。
  • 非常感谢,不好意思什么是消耗柜台零件?我对这些名字还是不太熟悉。
  • 我也第一次使用了(*SKIP)(*FAIL)动词,但它最后也留下了一个|
  • \) 是一种消费模式。正则表达式将) 放入匹配中,并将正则表达式索引推进到) 之后的位置。 (?&lt;=\)) 是一种非消耗模式。引擎检查左侧是否有),并返回真或假而不更新匹配文本,也不推进其索引。坚持 KISS 原则是最佳实践。保持超级简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 2015-11-06
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多