【问题标题】:Replace only space between two words, not between words and symbol or words and numbers仅替换两个单词之间的空格,而不是单词和符号或单词和数字之间的空格
【发布时间】:2020-01-14 19:48:36
【问题描述】:

我正在尝试使用 R 中的 stringr 包来识别单词之间的空格,而不是单词和符号之间的空格(反之亦然)或单词和数字(反之亦然),或符号和数字。

根据我的发现,似乎 [A-Za-z][:space:][a-zA-Z] 应该可以工作。我显然错过了一些东西,但不确定是什么。

我已经尝试了使用 [A-Za-z][:space:][a-zA-Z] 的 stringr 语法,以及用于空格的 regex(?) 语法,例如 [A-Za-z ]\s+[a-zA-Z]

str_replace_all(x, [A-Za-z][:space:][a-zA-Z], "_")

有时我会得到一个错误是“rep(value, length.out = nrows) 中的错误:尝试复制 'closure' 类型的对象”

【问题讨论】:

  • 如果您可以在预期输出的同时添加一些输入,这将非常有用且容易提供帮助。

标签: r regex stringr


【解决方案1】:

你可以使用

str_replace_all(x, "(?<=\\p{L})\\s(?=\\p{L})", "_")
gsub("(?<=\\p{L})\\s(?=\\p{L})", "_", x, perl=TRUE)

或者,如果有 1 个或多个空格要替换为 1 个_

str_replace_all(x, "(?<=\\p{L})\\s+(?=\\p{L})", "_")
gsub("(?<=\\p{L})\\s+(?=\\p{L})", "_", x, perl=TRUE)

regex demo

详情

  • (?&lt;=\p{L}) - 一个积极的后视,匹配紧接在前面的任何字母的位置
  • \s - 一个空格(\s+ 匹配 1+ 个空格)
  • (?=\p{L}) - 与紧随其后的任何字母的位置匹配的正向前瞻。

注意

  • 您应该将正则表达式模式用引号括起来以形成字符串文字
  • 如果您只想支持 ASCII 字母,可以将 \\p{L} 替换为 [A-Za-z]

【讨论】:

  • 感谢您的详尽解释。我注意到我仍然遇到错误Error in rep(value, length.out = nrows) : attempt to replicate an object of type 'closure' 关于可能导致它的任何建议?